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


81

我有一串

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

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

这似乎是一个简单的解析。虽然没有用。


6
单引号的格式不正确的JSON,因此,如果您收到类似的东西,你可能需要使用str.replace(),并尝试分析它之前取代单qoutes以“
AUP

1
无论如何,您应该始终尝试对JavaScript中的字符串使用单引号。var str = "bad example";这不是一个好习惯,最好执行以下操作:var str = 'good example';=>这样,您在JSON上不会有任何问题,在HTML上也不会有任何问题。:)
ReeCube

3
@ReeCube似乎只不过是一种意见而已-HTML没问题,它接受了两者。对于JSON,为什么仍要使用字符串创建它?我实际上不记得上一次我用对象以外的任何东西构建JSON的想法。
戴夫牛顿

2
@DaveNewton我定期从节点,python,php创建json字符串。
alfadog67

1
我想我不明白你的意思。但是没问题。
alfadog67

Answers:


87

JSON标准要求双引号,并且不接受单引号,也不会对解析器。

如果您的字符串很简单,字符串中没有转义的单引号(通常是不可能的,但这不是JSON),那么可以简单一点,str.replace(/'/g, '"')并以有效的JSON结尾。


5
您的答案将篡改数据。一个好的答案将改变结构,而不是改变数据结构内部的数据。
蒂莫西·冈萨雷斯

3
@ssube,用双引号全局替换单引号是第一个想到的方法,它是一种草率的方法,因为它可能破坏字典值。例如,'title': "Mama's Friend"将变为 "title": "Mama"s Friend",这当然是无效的!我应该对你的答复投反对票,但我反对。此评论值得更多。
Apostolos

31

我知道这是一篇旧文章,但是您可以为此使用JSON5

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

8
之所以提出这样的建议,是因为上述解决方案将失败,并显示诸如: {'section': "24'"} 变为: {"section": "24""} 且不会解析。
snedkov '18 -10-21

1
这应该是最佳答案。
Sam R.

完美的解决方案。试图从html的脚本标签中抓取JSON字符串,其中包含换行符和空白。拯救了我的一天!
DriLLFreAK100

对我来说,这很有效<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

如果您确定JSON受安全控制(而不是用户输入),则可以简单地评估JSON。Eval接受所有引用类型以及未引用的属性名称。

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

由于eval解析器的工作方式,因此需要额外的括号。当将Eval用于您控制的数据时,它并不是邪恶的。有关JSON.parse和eval()之间的区别的更多信息,请参见JSON.parse与eval()


2
即使您认为在这种情况下eval并不是邪恶的,JSON.parse总是更快:jsperf.com/json-parse-vs-eval/3
Arkanoid

@Arkanoid您链接到的基准不适用于这种情况,因为它仅使用有效的JSON(由于JSON.stringify)
syockit

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

这为我解决了问题。


1
这也会修改数据。{'a':"A'A"}将成为{"a":"A"A"}
GodSaveTheDoge

7

像这样:

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>


6

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

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

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

资料来源

如果属性需要双引号,则必须使用双引号。所有属性名称都必须用双引号引起来。


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

请解释你的答案
Sterling Archer

3
伙计们,永远不要这样做。这是超级不安全
jpumford

使用的原则 Function代替eval是合理的,但是其他所有方法都是错误的。应该是var json = Function("'use strict';return " + jsonString)()
Jack Giffin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.