<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: jsontotable</title>
    <description>The latest articles on DEV Community by jsontotable (@jsontotable).</description>
    <link>https://dev.to/jsontotable</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3566034%2F245e688f-2d42-43e2-9f70-1853dedbb93e.png</url>
      <title>DEV Community: jsontotable</title>
      <link>https://dev.to/jsontotable</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jsontotable"/>
    <language>en</language>
    <item>
      <title>Stop hand-writing INSERTs: JSON SQL with dialect-aware output(Postgres/MySQL/SQLite)</title>
      <dc:creator>jsontotable</dc:creator>
      <pubDate>Wed, 28 Jan 2026 06:57:19 +0000</pubDate>
      <link>https://dev.to/jsontotable/stop-hand-writing-inserts-json-sql-with-dialect-aware-outputpostgresmysqlsqlite-6ni</link>
      <guid>https://dev.to/jsontotable/stop-hand-writing-inserts-json-sql-with-dialect-aware-outputpostgresmysqlsqlite-6ni</guid>
      <description>&lt;p&gt;When you need to import JSON into a relational database, the “easy part” (copying data) quickly turns into the hard part: writing a schema and a pile of &lt;code&gt;INSERT&lt;/code&gt; statements that actually run on your target database.&lt;/p&gt;

&lt;p&gt;In practice, JSON → SQL gets annoying for three reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type inference:&lt;/strong&gt; JSON doesn’t carry a strict schema, so you have to decide what types to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arrays / nesting:&lt;/strong&gt; nested objects and arrays don’t map cleanly into a single flat table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dialect differences:&lt;/strong&gt; “SQL” isn’t one thing—Postgres, MySQL, and SQLite have enough differences to cause real runtime errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below is a practical workflow that works for the most common case (an array of objects you want to import as rows), plus a small example and a checklist of gotchas.&lt;/p&gt;




&lt;h2&gt;
  
  
  The minimal workflow that actually works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Start with a JSON array of objects
&lt;/h3&gt;

&lt;p&gt;If you can shape your data to an array of objects, the mapping is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;each object → one row&lt;/li&gt;
&lt;li&gt;object keys → column names&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your JSON is a single object (not an array), you can often wrap it into a one-element array for importing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Decide a stable column order
&lt;/h3&gt;

&lt;p&gt;You’ll save time later if you keep column order consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the key order from the first object (simple and predictable)&lt;/li&gt;
&lt;li&gt;Or sort keys alphabetically (stable across runs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consistency matters because it keeps your &lt;code&gt;INSERT&lt;/code&gt; columns and values aligned.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Choose a strategy for nested values
&lt;/h3&gt;

&lt;p&gt;You have to decide what to do with nested objects/arrays. There are two common strategies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flatten&lt;/strong&gt; nested keys (e.g., &lt;code&gt;address.city&lt;/code&gt; → &lt;code&gt;address_city&lt;/code&gt;) — best when you control the schema and need queryable columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stringify&lt;/strong&gt; nested values (store as text/JSON) — best for quick imports when you want deterministic output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a “get it into the DB quickly” workflow, &lt;strong&gt;stringify nested values&lt;/strong&gt; is usually the least painful.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Pick the SQL dialect before generating output
&lt;/h3&gt;

&lt;p&gt;This is the part people skip—and it’s the reason “valid SQL” still fails.&lt;/p&gt;

&lt;p&gt;Pick your target:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postgres&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…and generate SQL that matches that target.&lt;/p&gt;




&lt;h2&gt;
  
  
  A short example (JSON → CREATE TABLE + INSERT)
&lt;/h2&gt;

&lt;p&gt;Let’s use this JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A reasonable SQL output (conceptually) looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="nb"&gt;REAL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;TRUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Bob'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is intentionally “boring SQL”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s readable.&lt;/li&gt;
&lt;li&gt;It’s easy to run.&lt;/li&gt;
&lt;li&gt;It makes null-handling explicit.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Dialect notes (Postgres vs MySQL vs SQLite)
&lt;/h2&gt;

&lt;p&gt;You don’t need to memorize everything, but there are a few recurring differences worth calling out.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Identifiers and quoting
&lt;/h3&gt;

&lt;p&gt;Column names like &lt;code&gt;order&lt;/code&gt;, &lt;code&gt;group&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;, etc. can collide with reserved keywords.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Postgres often uses double quotes for identifiers: &lt;code&gt;"user"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;MySQL commonly uses backticks: &lt;code&gt;`user`&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;SQLite accepts double quotes, but behavior can vary depending on settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re generating SQL from arbitrary JSON keys, you need &lt;strong&gt;safe identifier quoting&lt;/strong&gt; (or key normalization).&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Data types aren’t identical
&lt;/h3&gt;

&lt;p&gt;Even when names look similar, behavior differs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite is famously permissive (dynamic typing). Many “types” are affinity hints.&lt;/li&gt;
&lt;li&gt;Postgres has strict types and richer type options.&lt;/li&gt;
&lt;li&gt;MySQL types are strict-ish but different again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For imports from JSON, the pragmatic path is to use a small set of common types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;integers → &lt;code&gt;INTEGER&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;floats → &lt;code&gt;REAL&lt;/code&gt; (or &lt;code&gt;DOUBLE&lt;/code&gt; depending on dialect)&lt;/li&gt;
&lt;li&gt;strings → &lt;code&gt;TEXT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;booleans → &lt;code&gt;BOOLEAN&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Booleans and NULL behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Postgres supports &lt;code&gt;TRUE/FALSE&lt;/code&gt; and a real boolean type.&lt;/li&gt;
&lt;li&gt;MySQL also supports boolean-ish behavior (often as &lt;code&gt;TINYINT(1)&lt;/code&gt; under the hood).&lt;/li&gt;
&lt;li&gt;SQLite doesn’t have a real boolean type; it stores 0/1 (but accepts many inputs).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For JSON imports, your generator should normalize booleans and nulls carefully.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common pitfalls (and how to avoid them)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pitfall #1: Mixed types across rows
&lt;/h3&gt;

&lt;p&gt;You’ll see this in the wild:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What type is &lt;code&gt;value&lt;/code&gt;? If you choose &lt;code&gt;INTEGER&lt;/code&gt;, the string row breaks. If you choose &lt;code&gt;TEXT&lt;/code&gt;, you lose numeric semantics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;default to &lt;code&gt;TEXT&lt;/code&gt; when types conflict, or&lt;/li&gt;
&lt;li&gt;add a “strict” mode that rejects mixed-type columns.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pitfall #2: NULLs hide your real type
&lt;/h3&gt;

&lt;p&gt;A column may be &lt;code&gt;null&lt;/code&gt; for many rows, which makes naive type inference pick the wrong type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;infer type from non-null values first; treat nulls as “unknown” until you see a real value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pitfall #3: Reserved keywords and unsafe column names
&lt;/h3&gt;

&lt;p&gt;JSON keys might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;user&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;select&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;created-at&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;some.key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These can break SQL or become annoying to query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical fix:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quote identifiers properly for your dialect, and/or&lt;/li&gt;
&lt;li&gt;normalize keys (e.g., &lt;code&gt;created-at&lt;/code&gt; → &lt;code&gt;created_at&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Want a quick converter?
&lt;/h2&gt;

&lt;p&gt;If you’d rather not hand-write schema + inserts, I built a free online JSON → SQL tool that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generates &lt;strong&gt;CREATE TABLE + INSERT&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;lets you choose a &lt;strong&gt;dialect (Postgres/MySQL/SQLite)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;supports practical options like column ordering and export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tool: &lt;a href="https://jsontotable.net/json-to-sql" rel="noopener noreferrer"&gt;https://jsontotable.net/json-to-sql&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want more examples and notes, here’s the guide:&lt;br&gt;
&lt;a href="https://jsontotable.net/blog/export-and-share/json-to-sql-create-table-insert-dialect-guide" rel="noopener noreferrer"&gt;https://jsontotable.net/blog/export-and-share/json-to-sql-create-table-insert-dialect-guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  If you found this useful
&lt;/h3&gt;

&lt;p&gt;Tell me what your hardest JSON→SQL case looks like (nested data? mixed types? huge payloads?). I’m collecting real-world cases to improve the converter’s defaults.&lt;/p&gt;

</description>
      <category>json</category>
      <category>sql</category>
      <category>postgres</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Turn Any JSON into a Clean HTML Table (No Code, No Uploads)</title>
      <dc:creator>jsontotable</dc:creator>
      <pubDate>Wed, 15 Oct 2025 07:56:07 +0000</pubDate>
      <link>https://dev.to/jsontotable/turn-any-json-into-a-clean-html-table-no-code-no-uploads-3dpi</link>
      <guid>https://dev.to/jsontotable/turn-any-json-into-a-clean-html-table-no-code-no-uploads-3dpi</guid>
      <description>&lt;p&gt;Ever copied a JSON response from an API and wished it looked like a spreadsheet? This post shows you how to turn messy JSON into clean tables in seconds—and export it in multiple formats without writing code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Try &lt;strong&gt;&lt;a href="https://jsontotable.net" rel="noopener noreferrer"&gt;jsontotable.net&lt;/a&gt;&lt;/strong&gt; — 100% client-side, your data never leaves your browser.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON is hard to read.&lt;/strong&gt; Nested objects and arrays are difficult to scan visually.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sharing is awkward.&lt;/strong&gt; Non-technical teammates can't work with raw JSON.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports need tables.&lt;/strong&gt; Stakeholders expect CSV/Excel/PDF they can open and sort.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Paste JSON → get instant table → copy or download in any format.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sample JSON:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"p_1001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wireless Mouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;24.99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ratings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"average"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;245&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"p_1002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bluetooth Headphones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"in_stock"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ratings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"average"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"reviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;523&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visit &lt;a href="https://jsontotable.net" rel="noopener noreferrer"&gt;jsontotable.net&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Paste your JSON → table appears instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy&lt;/strong&gt; (HTML/CSV/Markdown) or &lt;strong&gt;Download&lt;/strong&gt; (CSV/Excel/PDF)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No signup. No uploads. Just results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔒 100% Privacy-First
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;All processing happens in your browser&lt;/li&gt;
&lt;li&gt;Your data never touches any server&lt;/li&gt;
&lt;li&gt;Works offline after initial load&lt;/li&gt;
&lt;li&gt;Perfect for sensitive data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📋 Multiple Copy Options
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copy HTML Table&lt;/strong&gt; → paste into Word, Google Docs, Notion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy CSV&lt;/strong&gt; → quick transfer to spreadsheets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy Markdown&lt;/strong&gt; → GitHub READMEs and documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💾 Flexible Downloads
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSV&lt;/strong&gt; → Excel, Google Sheets compatible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel (.xlsx)&lt;/strong&gt; → native Excel format with formatting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF&lt;/strong&gt; → print-ready reports&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Smart Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time preview as you type&lt;/li&gt;
&lt;li&gt;Instant search and filtering&lt;/li&gt;
&lt;li&gt;Handles nested JSON automatically&lt;/li&gt;
&lt;li&gt;Sorts by clicking column headers&lt;/li&gt;
&lt;li&gt;Syntax-highlighted editor&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How It Handles Different JSON
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Arrays of Objects&lt;/strong&gt; → Multi-column table with headers&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jane"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Nested Data&lt;/strong&gt; → Formatted JSON in cells (preserves structure)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NYC"&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mixed Structures&lt;/strong&gt; → Handles rows with different keys&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b@test.com"&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool automatically creates columns for all unique keys across objects.&lt;/p&gt;




&lt;h2&gt;
  
  
  Copy vs Download
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Copy&lt;/strong&gt; (puts data in clipboard):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ HTML Table → paste into any WYSIWYG editor&lt;/li&gt;
&lt;li&gt;✅ CSV → quick data transfer&lt;/li&gt;
&lt;li&gt;✅ Markdown → perfect for docs/wikis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt; (saves files):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ CSV → spreadsheet-ready format&lt;/li&gt;
&lt;li&gt;✅ Excel (.xlsx) → native Excel with formatting&lt;/li&gt;
&lt;li&gt;✅ PDF → professional reports&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;API Development&lt;/strong&gt;: Paste API responses to quickly visualize data patterns&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Analysis&lt;/strong&gt;: Convert JSON datasets to Excel for analysis and reporting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Copy Markdown tables for GitHub READMEs and wikis&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team Collaboration&lt;/strong&gt;: Share CSV/Excel with non-technical teammates&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Workflows&lt;/strong&gt;: Format ChatGPT/Claude outputs into readable tables&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Optimized for datasets with 50,000+ rows&lt;/li&gt;
&lt;li&gt;No server round-trips = instant conversion&lt;/li&gt;
&lt;li&gt;For very large files (&amp;gt;100MB), export directly to CSV/Excel for best performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Does my data leave the browser?&lt;/strong&gt;&lt;br&gt;
A: No. 100% client-side processing. No uploads, no tracking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I paste into Google Docs or Word?&lt;/strong&gt;&lt;br&gt;
A: Yes! For Google Docs, use "Copy CSV" format. For Microsoft Word, use "Copy HTML Table" for best formatting preservation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is it really free?&lt;/strong&gt;&lt;br&gt;
A: Yes. No premium tiers, no usage limits, free forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Now
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://jsontotable.net" rel="noopener noreferrer"&gt;jsontotable.net&lt;/a&gt; and paste your JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Instant table preview&lt;/li&gt;
&lt;li&gt;✅ Copy as HTML/CSV/Markdown&lt;/li&gt;
&lt;li&gt;✅ Download as CSV/Excel/PDF&lt;/li&gt;
&lt;li&gt;✅ Real-time search and sort&lt;/li&gt;
&lt;li&gt;✅ 100% private (no uploads)&lt;/li&gt;
&lt;li&gt;✅ Free forever&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;Built with Next.js 14, React 18, TypeScript, and TanStack Table. All processing happens client-side using Web APIs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I built this tool to solve my own need for quick JSON visualization. Feedback and suggestions are always welcome!&lt;/em&gt; 🙌&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>nextjs</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
