<?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: Mark Foster</title>
    <description>The latest articles on DEV Community by Mark Foster (@devstone).</description>
    <link>https://dev.to/devstone</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%2F4163598%2F18a58086-b6ee-4657-8e85-fe74483847c6.png</url>
      <title>DEV Community: Mark Foster</title>
      <link>https://dev.to/devstone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/devstone"/>
    <language>en</language>
    <item>
      <title>How to Fix the 8 Most Common JSON Errors</title>
      <dc:creator>Mark Foster</dc:creator>
      <pubDate>Mon, 05 Oct 2026 10:38:16 +0000</pubDate>
      <link>https://dev.to/devstone/how-to-fix-the-8-most-common-json-errors-25d2</link>
      <guid>https://dev.to/devstone/how-to-fix-the-8-most-common-json-errors-25d2</guid>
      <description>&lt;p&gt;&lt;code&gt;SyntaxError: Unexpected token } in JSON at position 212&lt;/code&gt; is one of the least helpful error messages a developer sees. It tells you &lt;em&gt;that&lt;/em&gt; the JSON is broken, but not &lt;em&gt;why&lt;/em&gt;, and the position is a character offset you have to count to.&lt;/p&gt;

&lt;p&gt;The good news: almost every JSON error comes from the same short list of mistakes. This guide covers the eight you will hit most often, what the error looks like in JavaScript and Python, and how to fix each one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quickest fix:&lt;/strong&gt; paste your JSON into the &lt;a href="https://devbrace.com/json-validator" rel="noopener noreferrer"&gt;JSON Validator&lt;/a&gt;. It names the mistake in plain English, shows the exact line and column, and highlights the broken line.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why JSON is so strict
&lt;/h2&gt;

&lt;p&gt;JSON looks like a JavaScript object literal, but it is a much smaller language. The &lt;a href="https://www.rfc-editor.org/rfc/rfc8259" rel="noopener noreferrer"&gt;specification (RFC 8259)&lt;/a&gt; allows only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objects &lt;code&gt;{}&lt;/code&gt; with &lt;strong&gt;double-quoted&lt;/strong&gt; string keys,&lt;/li&gt;
&lt;li&gt;arrays &lt;code&gt;[]&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;strings in &lt;strong&gt;double quotes&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;numbers, &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt; and &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No comments, no trailing commas, no single quotes, no &lt;code&gt;undefined&lt;/code&gt;. Being strict is what makes JSON portable — every language parses it the same way — but it means small habits from JavaScript or Python break it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Trailing commas
&lt;/h2&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;"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;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&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;JavaScript, TypeScript and Python all allow a comma after the last item. JSON does not.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript:&lt;/strong&gt; &lt;code&gt;Expected double-quoted property name in JSON at position 41 (line 4 column 1)&lt;/code&gt; in current Chrome and Node.js; older engines say &lt;code&gt;Unexpected token } in JSON&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python:&lt;/strong&gt; &lt;code&gt;json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; remove the comma after the last property or array item.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Single quotes
&lt;/h2&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;'Jane'&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;Strings and keys must use double quotes (&lt;code&gt;"&lt;/code&gt;). Single quotes are the most common mistake when JSON is typed by hand or copied from Python's &lt;code&gt;print()&lt;/code&gt; of a dict.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; replace &lt;code&gt;'&lt;/code&gt; with &lt;code&gt;"&lt;/code&gt;. If you are producing JSON from Python, use &lt;code&gt;json.dumps(data)&lt;/code&gt; instead of &lt;code&gt;str(data)&lt;/code&gt; — &lt;code&gt;str()&lt;/code&gt; prints Python syntax, not JSON.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Unquoted keys
&lt;/h2&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;"Jane"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;age:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;31&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;Valid JavaScript, invalid JSON. Every key must be a double-quoted string.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; wrap each key in double quotes: &lt;code&gt;{ "name": "Jane", "age": 31 }&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Missing commas
&lt;/h2&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;"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="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"admin"&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;Usually caused by adding a new line to an existing object and forgetting the comma on the line above. The parser reports the error on the &lt;em&gt;second&lt;/em&gt; line, which is confusing — the mistake is really at the end of the line before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; add a comma after &lt;code&gt;"Jane"&lt;/code&gt;. When an error points to the start of a line, always check the end of the previous line first.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Comments
&lt;/h2&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;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;database&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;settings&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"host"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"localhost"&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;JSON has no comment syntax. Some tools accept “JSONC” (JSON with comments) — VS Code's &lt;code&gt;settings.json&lt;/code&gt; and &lt;code&gt;tsconfig.json&lt;/code&gt; are examples — but a standard parser like &lt;code&gt;JSON.parse&lt;/code&gt; will reject it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; remove the comments. If your config needs comments, consider YAML or TOML instead — see &lt;a href="https://devbrace.com/json-to-yaml" rel="noopener noreferrer"&gt;JSON to YAML&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Python and JavaScript values that aren't JSON
&lt;/h2&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;"active"&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;"manager"&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="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="err"&gt;NaN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;undefined&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;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Not JSON&lt;/th&gt;
&lt;th&gt;Use instead&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;True&lt;/code&gt; / &lt;code&gt;False&lt;/code&gt; (Python)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;None&lt;/code&gt; (Python)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;undefined&lt;/code&gt; (JavaScript)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;null&lt;/code&gt;, or leave the key out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;NaN&lt;/code&gt;, &lt;code&gt;Infinity&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;null&lt;/code&gt;, or a string like &lt;code&gt;"NaN"&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;NaN&lt;/code&gt; is a sneaky one: Python's &lt;code&gt;json.dumps&lt;/code&gt; writes &lt;code&gt;NaN&lt;/code&gt; by default, producing output that other parsers (including JavaScript's) reject. Pass &lt;code&gt;allow_nan=False&lt;/code&gt; to catch it early.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Unescaped characters inside strings
&lt;/h2&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;ew&lt;/span&gt;&lt;span class="se"&gt;\f&lt;/span&gt;&lt;span class="s2"&gt;older"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"She said "&lt;/span&gt;&lt;span class="err"&gt;hi&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside a JSON string, a backslash starts an escape sequence and a double quote ends the string. So &lt;code&gt;\n&lt;/code&gt; becomes a newline, &lt;code&gt;\f&lt;/code&gt; a form feed — and &lt;code&gt;"hi"&lt;/code&gt; closes the string early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; escape backslashes as &lt;code&gt;\\&lt;/code&gt; and quotes as &lt;code&gt;\"&lt;/code&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;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;new&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;folder"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"quote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"She said &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;hi&lt;/span&gt;&lt;span class="se"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Literal line breaks and tabs inside a string are also invalid; use &lt;code&gt;\n&lt;/code&gt; and &lt;code&gt;\t&lt;/code&gt;. The &lt;a href="https://devbrace.com/json-escape" rel="noopener noreferrer"&gt;JSON Escape tool&lt;/a&gt; converts any text into a correctly escaped JSON string.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. The response isn't JSON at all
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SyntaxError: Unexpected token '&amp;lt;', "&amp;lt;!DOCTYPE "... is not valid JSON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Older engines: &lt;code&gt;Unexpected token &amp;lt; in JSON at position 0&lt;/code&gt;.) If the first character is &lt;code&gt;&amp;lt;&lt;/code&gt;, you are not parsing JSON — you are parsing an HTML page. Typical causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the URL is wrong and the server returned a 404 page,&lt;/li&gt;
&lt;li&gt;your session expired and you were redirected to a login page,&lt;/li&gt;
&lt;li&gt;the server crashed and returned an HTML error page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; log the raw response before parsing it, and check the status code and &lt;code&gt;Content-Type&lt;/code&gt; header:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Expected JSON, got &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A similar case is &lt;code&gt;Unexpected end of JSON input&lt;/code&gt;, which means the text was empty or cut off — often an empty response body from a &lt;code&gt;204 No Content&lt;/code&gt; or a request that timed out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Errors that aren't syntax errors
&lt;/h2&gt;

&lt;p&gt;Some JSON parses fine but still causes bugs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate keys:&lt;/strong&gt; &lt;code&gt;{"role": "user", "role": "admin"}&lt;/code&gt; is accepted by most parsers, which silently keep the last value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Big numbers:&lt;/strong&gt; integers above 9,007,199,254,740,991 (2&lt;sup&gt;53&lt;/sup&gt; − 1) lose precision in JavaScript. &lt;code&gt;1234567890123456789&lt;/code&gt; becomes &lt;code&gt;1234567890123456800&lt;/code&gt; after &lt;code&gt;JSON.parse&lt;/code&gt;. Send large IDs as strings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://devbrace.com/json-validator" rel="noopener noreferrer"&gt;JSON Validator&lt;/a&gt; warns about both, even when the syntax is valid.&lt;/p&gt;

&lt;h2&gt;
  
  
  A debugging checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Validate the text and go to the reported line.&lt;/li&gt;
&lt;li&gt;If the error is at the start of a line, check the &lt;strong&gt;end of the previous line&lt;/strong&gt; (missing comma).&lt;/li&gt;
&lt;li&gt;If the error mentions &lt;code&gt;&amp;lt;&lt;/code&gt; or &lt;code&gt;&amp;lt;!DOCTYPE&lt;/code&gt;, you received HTML — check the request, not the JSON.&lt;/li&gt;
&lt;li&gt;Search for &lt;code&gt;'&lt;/code&gt;, &lt;code&gt;//&lt;/code&gt;, &lt;code&gt;True&lt;/code&gt;, &lt;code&gt;None&lt;/code&gt;, &lt;code&gt;NaN&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Once it parses, &lt;a href="https://devbrace.com/json-formatter" rel="noopener noreferrer"&gt;format it&lt;/a&gt; so the structure is easy to review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Most JSON errors take seconds to fix once you know which of these eight you are looking at.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://devbrace.com/blog/fix-common-json-errors" rel="noopener noreferrer"&gt;devbrace.com&lt;/a&gt;. DevBrace is a set of free developer tools that run entirely in your browser.&lt;/em&gt;&lt;/p&gt;

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