<?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: Adam Siegel</title>
    <description>The latest articles on DEV Community by Adam Siegel (@coolstuff).</description>
    <link>https://dev.to/coolstuff</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4048264%2Ff8a63cc0-150e-41d5-86fc-76d05d04684d.png</url>
      <title>DEV Community: Adam Siegel</title>
      <link>https://dev.to/coolstuff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coolstuff"/>
    <language>en</language>
    <item>
      <title>Are duplicate keys valid in JSON? What RFC 8259 actually says</title>
      <dc:creator>Adam Siegel</dc:creator>
      <pubDate>Sun, 26 Jul 2026 18:25:19 +0000</pubDate>
      <link>https://dev.to/coolstuff/are-duplicate-keys-valid-in-json-what-rfc-8259-actually-says-p10</link>
      <guid>https://dev.to/coolstuff/are-duplicate-keys-valid-in-json-what-rfc-8259-actually-says-p10</guid>
      <description>&lt;p&gt;RFC 8259 says object names SHOULD be unique — so duplicates are legal but the behavior is unpredictable. See which value each parser keeps, how to reject duplicates in Python and JavaScript, and how to find them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Are duplicate keys allowed in JSON?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes — but the result is unpredictable. RFC 8259 says object names should be unique, not must, so duplicates are not a syntax error. Every mainstream parser (JavaScript, Python, Go, Java, jq) silently keeps the last occurrence and discards the earlier ones — but because the spec leaves it undefined, you cannot rely on that.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A duplicate key occurs when two or more properties in the same JSON object share the same name:&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="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;"Ada"&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="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;duplicate!&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;What RFC 8259 actually says&lt;/strong&gt;&lt;br&gt;
The specification uses RFC 2119 keywords very deliberately here. Section 4 states that the names within an object should be unique — a recommendation, not a requirement. It then spells out the consequence: when the names within an object are not unique, the behavior of software that receives that object is unpredictable.&lt;/p&gt;

&lt;p&gt;Two words carry all the weight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SHOULD, not MUST — a document with duplicate names is still well-formed JSON. Validators that only check syntax will pass it.&lt;/li&gt;
&lt;li&gt;Unpredictable, not undefined-and-harmless — the spec is warning you that two conforming parsers may legitimately disagree about what your document means.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RFC 8259 also defines what it means for an object to be interoperable: one whose names are all unique, so that every implementation receiving it agrees on the name-value mappings. Duplicate names put you outside that guarantee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What real parsers actually do&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON.parse (V8 / SpiderMonkey) — keeps the last value. Silent.&lt;/li&gt;
&lt;li&gt;Python json.loads — keeps the last value. Silent.&lt;/li&gt;
&lt;li&gt;Go encoding/json — keeps the last value. Silent.&lt;/li&gt;
&lt;li&gt;Java Jackson — configurable; by default keeps the last value.&lt;/li&gt;
&lt;li&gt;jq — keeps the last value. Silent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of them error by default, which means duplicate keys cause silent data loss — one value is quietly overwritten.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript — last value wins, no warning&lt;/span&gt;
&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"id": 1, "id": 2}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// { id: 2 }&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Python&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nx"&gt;same&lt;/span&gt;
&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"id": 1, "id": 2}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&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="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;jq&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nx"&gt;same&lt;/span&gt;
&lt;span class="nx"&gt;echo&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"id": 1, "id": 2}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;jq&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;    &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How to make your parser reject duplicates&lt;/strong&gt;&lt;br&gt;
Both major languages let you opt into strict behavior. This is worth doing whenever you ingest JSON you did not generate yourself.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Python — object_pairs_hook&lt;/code&gt;&lt;br&gt;
Python's json module hands object_pairs_hook the raw list of key/value pairs before they collapse into a dict, so you can detect repeats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;no_duplicates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;pairs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Duplicate key: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;!r}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;seen&lt;/span&gt;

&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 1, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 2}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;object_pairs_hook&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no_duplicates&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# ValueError: Duplicate key: 'id'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;JavaScript — a reviver can't do it, so check the source text&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A JSON.parse reviver runs after duplicates have already collapsed, so it cannot see them. Use a streaming or lossless parser when it matters:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// The reviver is too late — it only ever sees the surviving value.
// Use a parser that preserves duplicates, e.g.:
//   npm i lossless-json      → parse with { parseNumber } and inspect pairs
//   npm i json-source-map    → gives you byte offsets for every key
// Or lint the raw text before parsing (see the linter below).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How other formats handle it&lt;/strong&gt;&lt;br&gt;
JSON is unusually permissive here. If duplicate keys are a real risk in your pipeline, the format itself may be the fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TOML — duplicate keys are explicitly invalid. The spec forbids redefining a key, and parsers raise an error.&lt;/li&gt;
&lt;li&gt;YAML 1.2 — duplicate mapping keys are an error in the spec; most loaders (including PyYAML with a strict loader) reject or warn.&lt;/li&gt;
&lt;li&gt;Protocol Buffers / Avro — a schema defines each field once, so duplicates are impossible by construction.&lt;/li&gt;
&lt;li&gt;JSON — the outlier: syntactically legal, semantically unpredictable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why duplicates almost always mean a bug&lt;/strong&gt;&lt;br&gt;
If both copies of the key are intentional, the right structure is an array. If one is a mistake — a copy-paste error, a template substitution gone wrong, or a merge artifact — one value is dropped without warning. Neither case is what the author wanted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to find duplicate keys&lt;/strong&gt;&lt;br&gt;
The &lt;a href="https://www.jsonfyi.com/json-linter" rel="noopener noreferrer"&gt;JSON FYI linter&lt;/a&gt; flags every duplicate key with the line and column of both the original definition and the duplicate. Paste your JSON securely into the linter.&lt;/p&gt;

</description>
      <category>json</category>
      <category>api</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Every common JSON error, mapped to its fix (JS, Python, Postgres)</title>
      <dc:creator>Adam Siegel</dc:creator>
      <pubDate>Sun, 26 Jul 2026 18:11:21 +0000</pubDate>
      <link>https://dev.to/coolstuff/every-common-json-error-mapped-to-its-fix-js-python-postgres-2243</link>
      <guid>https://dev.to/coolstuff/every-common-json-error-mapped-to-its-fix-js-python-postgres-2243</guid>
      <description>&lt;p&gt;Every common JSON error mapped to its cause and fix — trailing commas, single quotes, 'Unexpected token', JSONDecodeError — each with a dedicated guide.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What causes most JSON errors?&lt;/strong&gt;&lt;br&gt;
Nearly every JSON parse failure comes from one of a few mistakes — a trailing comma, single quotes, an unquoted key, a comment, or a response that wasn't JSON at all (an HTML error page, an empty body). The parser reports the first character it can't accept, with a line and column. This guide maps every common error message to its cause and its fix, and links a focused walkthrough for each.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Match the error message to its fix&lt;/strong&gt;&lt;br&gt;
Parsers phrase the same underlying mistake differently across languages. Find the message you're seeing and jump to the guide that fixes it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript · JSON.parse()&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unexpected token … in JSON — a stray or missing character partway through. See &lt;a href="https://www.jsonfyi.com/learn/unexpected-token-json" rel="noopener noreferrer"&gt;Unexpected token in JSON&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Unexpected token '&amp;lt;' — the server returned an HTML page, not JSON. See &lt;a href="https://www.jsonfyi.com/learn/syntaxerror-unexpected-token-less-than" rel="noopener noreferrer"&gt;Unexpected token '&amp;lt;'.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Unexpected end of JSON input — the document was truncated or empty. See &lt;a href="https://www.jsonfyi.com/learn/unexpected-end-of-json-input" rel="noopener noreferrer"&gt;Unexpected end of JSON input&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fails immediately at position 0 — empty string, BOM, or undefined. See &lt;a href="https://www.jsonfyi.com/learn/json-parse-error-position-0" rel="noopener noreferrer"&gt;JSON parse error at position 0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Converting circular structure to JSON — an object references itself. See &lt;a href="https://www.jsonfyi.com/learn/json-circular-reference-error" rel="noopener noreferrer"&gt;circular structure to JSON&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;JSON.stringify returned undefined — the value can't be serialized. See &lt;a href="https://www.jsonfyi.com/learn/json-stringify-undefined" rel="noopener noreferrer"&gt;JSON.stringify returns undefined&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Python · json.loads() / json.load()&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSONDecodeError — the umbrella error, with a line, column, and char offset. See &lt;a href="https://www.jsonfyi.com/learn/json-decode-error-python" rel="noopener noreferrer"&gt;Python JSONDecodeError&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Expecting property name enclosed in double quotes — single-quoted keys or a Python dict. See &lt;a href="https://www.jsonfyi.com/learn/expecting-property-name-enclosed-in-double-quotes" rel="noopener noreferrer"&gt;Expecting property name enclosed in double quotes&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;No JSON object could be decoded — the older Python 2 / requests phrasing for a non-JSON body. See &lt;a href="https://www.jsonfyi.com/learn/no-json-object-could-be-decoded" rel="noopener noreferrer"&gt;No JSON object could be decoded&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Databases · PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invalid input syntax for type json — single quotes, an empty string, or double-encoded JSON in an INSERT. See &lt;a href="https://www.jsonfyi.com/learn/invalid-input-syntax-for-type-json" rel="noopener noreferrer"&gt;Postgres: invalid input syntax for type json&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The mistakes behind most syntax errors&lt;/strong&gt;&lt;br&gt;
Whatever the message, the underlying cause is usually one of these. Each is invalid JSON even though it looks fine at a glance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trailing commas&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="nl"&gt;"a"&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;"b"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✗&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;invalid&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;"a"&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;"b"&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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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 single most common JSON error. See &lt;a href="https://www.jsonfyi.com/learn/trailing-commas-in-json" rel="noopener noreferrer"&gt;trailing commas in JSON&lt;/a&gt; for why every strict parser rejects them and how JSON5/JSONC differ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-quoted strings&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="err"&gt;'name':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'Ada'&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✗&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;invalid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(single&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;quotes)&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;"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;"Ada"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;Unquoted keys&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="err"&gt;name:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Ada"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✗&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;invalid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(unquoted&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;key)&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;"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;"Ada"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;JavaScript-style comments&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="nl"&gt;"a"&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="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;note&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✗&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;invalid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;has&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;comments&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;"a"&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;"_note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sibling&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;field&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSON has no comment syntax at all. See &lt;a href="https://www.jsonfyi.com/learn/json-comments" rel="noopener noreferrer"&gt;JSON comments&lt;/a&gt; for five practical workarounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong literals&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="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;None&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;✗&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;literals&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;"ok"&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;"x"&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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&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;Unescaped control characters&lt;/strong&gt;&lt;br&gt;
Real newlines and tabs inside strings are illegal — escape them: \n, \t. See &lt;a href="https://www.jsonfyi.com/learn/json-escape-characters" rel="noopener noreferrer"&gt;how to escape characters in JSON&lt;/a&gt; for the complete table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate keys&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="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;"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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;⚠&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;legal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;but&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;unpredictable&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RFC 8259 says names should be unique, so duplicates parse but most parsers silently keep the last value. See &lt;a href="https://www.jsonfyi.com/learn/duplicate-key-json" rel="noopener noreferrer"&gt;are duplicate keys valid in JSON?&lt;/a&gt; for what each parser does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Numeric oddities&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No leading zeros: 007 is invalid. Use 7.&lt;/li&gt;
&lt;li&gt;No NaN, Infinity, or undefined — use null when you mean "no value".&lt;/li&gt;
&lt;li&gt;No hexadecimal: 0xFF is invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Find the exact character&lt;/strong&gt;&lt;br&gt;
The fastest way to locate any of these is to paste the document into a validator that reports the precise line and column. If you'd rather see structural problems — trailing commas, duplicate keys, comments — flagged as warnings, use the &lt;a href="https://www.jsonfyi.com/json-linter" rel="noopener noreferrer"&gt;JSON linter&lt;/a&gt;. To confirm the shape of your data against required fields and types, use the &lt;a href="https://www.jsonfyi.com/json-schema-validator" rel="noopener noreferrer"&gt;JSON Schema validator&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New to the format?&lt;/strong&gt; Start with &lt;a href="https://www.jsonfyi.com/learn/what-is-json" rel="noopener noreferrer"&gt;what is JSON&lt;/a&gt; and the &lt;a href="https://www.jsonfyi.com/learn/json-data-types" rel="noopener noreferrer"&gt;data types reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>json</category>
      <category>webdev</category>
      <category>python</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
