Parsing string as JSON with single quotes?

JavascriptJson

Javascript Problem Overview


I have a string

str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)

How can I parse the above string (str) into a JSON object ?

This seems like a simple parsing. It's not working though.

Javascript Solutions


Solution 1 - Javascript

The JSON standard requires double quotes and will not accept single quotes, nor will the parser.

If you have a simple case with no escaped single quotes in your strings (which would normally be impossible, but this isn't JSON), you can simple str.replace(/'/g, '"') and you should end up with valid JSON.

Solution 2 - Javascript

I know it's an old post, but you can use JSON5 for this purpose.

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>

Solution 3 - Javascript

If you are sure your JSON is safely under your control (not user input) then you can simply evaluate the JSON. Eval accepts all quote types as well as unquoted property names.

var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');

The extra parentheses are required due to how the eval parser works. Eval is not evil when it is used on data you have control over. For more on the difference between JSON.parse and eval() see JSON.parse vs. eval()

Solution 4 - Javascript

Using single quotes for keys are not allowed in JSON. You need to use double quotes.

For your use-case perhaps this would be the easiest solution:

str = '{"a":1}';

Source:

> If a property requires quotes, double quotes must be used. All > property names must be surrounded by double quotes.

Solution 5 - Javascript

var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

This solved the problem for me.

Solution 6 - Javascript

Something like this:

var div = document.getElementById("result");

var str = "{'a':1}";
  str = str.replace(/\'/g, '"');
  var parsed = JSON.parse(str);
  console.log(parsed);
  div.innerText = parsed.a;

<div id="result"></div>

Solution 7 - Javascript

// regex uses look-forwards and look-behinds to select only single-quotes that should be selected
const regex = /('(?=(,\s*')))|('(?=:))|((?<=([:,]\s*))')|((?<={)')|('(?=}))/g;
str = str.replace(regex, '"');
str = JSON.parse(str);

The other answers simply do not work in enough cases. Such as the above cited case: "title": "Mama's Friend", it naively will convert the apostrophe unless you use regex. JSON5 will want the removal of single quotes, introducing a similar problem.

Warning: although I believe this is compatible with all situations that will reasonably come up, and works much more often than other answers, it can still break in theory.

Solution 8 - Javascript

If you assume that the single-quoted values are going to be displayed, then instead of this:

str = str.replace(/\'/g, '"');

you can keep your display of the single-quote by using this:

str = str.replace(/\'/g, '\&apos;\');

which is the HTML equivalent of the single quote.

Solution 9 - Javascript

json = ( new Function("return " + jsonString) )(); 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCoderaemonView Question on Stackoverflow
Solution 1 - JavascriptssubeView Answer on Stackoverflow
Solution 2 - JavascriptMinView Answer on Stackoverflow
Solution 3 - Javascriptd'Artagnan Evergreen BarbosaView Answer on Stackoverflow
Solution 4 - JavascriptJonathan.BrinkView Answer on Stackoverflow
Solution 5 - JavascriptVaishnavi DongreView Answer on Stackoverflow
Solution 6 - JavascriptaupView Answer on Stackoverflow
Solution 7 - JavascriptSean AHView Answer on Stackoverflow
Solution 8 - Javascriptuser1941464View Answer on Stackoverflow
Solution 9 - Javascriptgreg millerView Answer on Stackoverflow