我有一个字符串
str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)
Run Code Online (Sandbox Code Playgroud)
我如何解析字符串(str)上面的JSON?这看起来像一个简单的解析; 它不是以某种方式工作.
ssu*_*ube 68
该JSON标准要求双引号,并且不接受单引号,也不会对解析器.
如果你有在你的字符串没有逃过单引号简单的情况下(这通常是不可能的,但这不是JSON),你可以简单的str.replace(/'/g, '"'),你应该结束了有效的JSON.
小智 12
我知道这是一篇旧文章,但您可以为此使用JSON5。
<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
Run Code Online (Sandbox Code Playgroud)
小智 8
如果确定您的JSON受安全控制(而不是用户输入),则只需评估JSON。Eval接受所有引用类型以及未引用的属性名称。
var str = "{'a':1}";
var myObject = eval('(' + str + ')');
Run Code Online (Sandbox Code Playgroud)
由于eval解析器的工作方式,因此需要额外的括号。将Eval用于您控制的数据时,它并不是邪恶的。有关JSON.parse和eval()之间的区别的更多信息,请参见JSON.parse与eval()
var str = "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);
Run Code Online (Sandbox Code Playgroud)
这为我解决了这个问题。
JSON 中不允许对键使用单引号。您需要使用双引号。
对于您的用例,这可能是最简单的解决方案:
str = '{"a":1}';
Run Code Online (Sandbox Code Playgroud)
来源:
如果属性需要引号,则必须使用双引号。所有属性名称都必须用双引号括起来。
像这样:
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;Run Code Online (Sandbox Code Playgroud)
<div id="result"></div>Run Code Online (Sandbox Code Playgroud)
// 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);
Run Code Online (Sandbox Code Playgroud)
其他答案在足够多的情况下根本不起作用。例如上面引用的情况:"title": "Mama's Friend",除非您使用正则表达式,否则它会天真地转换撇号。JSON5 将希望删除单引号,从而引入类似的问题。
警告:虽然我相信这与所有合理出现的情况兼容,并且比其他答案更有效,但理论上它仍然可能会崩溃。