将字符串解析为带单引号的 JSON?

我有根绳子

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

如何将上面的字符串(str)解析为 JSON 对象?

这看起来像是一个简单的解析,但是不起作用。

176550 次浏览

在 JSON 中不允许对键使用单引号。您需要使用双引号。

对于您的用例,也许这是最简单的解决方案:

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

资料来源:

如果属性需要引号,则必须使用双引号 属性名必须用双引号括起来。

JSON 标准需要双引号,不接受单引号,解析器也不接受。

如果您的字符串中没有转义的单引号(这通常是不可能的,但这不是 JSON) ,那么可以使用简单的 str.replace(/'/g, '"'),最终应该得到有效的 JSON。

就像这样:

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>

如果您确信您的 JSON 在您的控制之下(而不是用户输入) ,那么您可以简单地评估 JSON。Eval 接受所有引号类型以及未引号的属性名。

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

由于 eval 解析器的工作方式,需要额外的括号。 当 Eval 用于您可以控制的数据时,它并不邪恶。 有关 JSON.parse 和 eval ()之间差异的更多信息,请参见 < a href = “ https://stackoverflow. com/questions/1843343/json-parse-vs-eval”> JSON.parse vs. eval ()

我知道这是一个旧的职位,但你可以使用 JSON5为此目的。

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
json = ( new Function("return " + jsonString) )();
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

这为我解决了问题。

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

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

您可以使用以下命令来保持单引号的显示:

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

which is the HTML equivalent of the single quote.

// 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.

警告: 虽然我相信这是兼容的所有情况下,将合理地出现,并更多地工作比其他答案,它仍然可以打破在理论上。