Javascript 将字符串解析为带单引号的JSON?
我有一根绳子Javascript 将字符串解析为带单引号的JSON?,javascript,json,Javascript,Json,我有一根绳子 str = "{'a':1}"; JSON.parse(str); VM514:1 Uncaught SyntaxError: Unexpected token '(…) 如何将上述字符串(str)解析为JSON对象 这似乎是一个简单的解析。但是它不起作用。在JSON中不允许对键使用单引号。你需要使用双引号 对于您的用例,这可能是最简单的解决方案: str = '{"a":1}'; : 如果属性需要引号,则必须使用双引号。全部的 属性名称必须用双引号括起来 需要双引号,不接受单
str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)
如何将上述字符串(str)解析为JSON对象
这似乎是一个简单的解析。但是它不起作用。在JSON中不允许对键使用单引号。你需要使用双引号 对于您的用例,这可能是最简单的解决方案:
str = '{"a":1}';
:
如果属性需要引号,则必须使用双引号。全部的
属性名称必须用双引号括起来
需要双引号,不接受单引号,解析器也不接受单引号
如果字符串中有一个简单的case,没有转义单引号(这通常是不可能的,但这不是JSON),那么可以使用simplestr.replace(/'/g'“)
,最后应该是有效的JSON。类似这样的内容:
var div=document.getElementById(“结果”);
var str=“{a':1}”;
str=str.replace(/\'/g'”);
var parsed=JSON.parse(str);
console.log(已解析);
div.innerText=parsed.a代码>
如果您确信您的JSON在您的控制下(而不是用户输入),那么您可以简单地评估JSON。Eval接受所有引用类型以及未引用的属性名称
var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');
由于eval解析器的工作方式,需要额外的括号。
当Eval用于您可以控制的数据时,它不是邪恶的。
有关JSON.parse和eval()之间差异的更多信息,请参见我知道这是一篇老文章,但您可以使用它
<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
stringify(JSON5.parse({a:1}'))
这就解决了我的问题。单引号不是正确格式的json,因此如果您收到类似的内容,您可能需要使用str.replace()并将单引号替换为“在尝试解析它之前,您应该始终尝试在javascript中对字符串使用单引号。var str=“坏例子";代码>不是好的实践,最好做以下几点:var str='good example'代码>=>像这样,JSON不会有任何问题,HTML也不会有任何问题。:)@ReeCube看起来只不过是一种观点——不管怎么说,HTML没有问题,它接受两者。对于JSON,为什么还要用字符串创建它呢?我不记得上一次用对象以外的任何东西构建JSON了。请解释你的答案,永远不要这样做。这是非常不安全的使用函数
代替eval的原则是合理的,但其他一切都是错误的。它应该是var json=Function(“'use strict';return”+jsonString)(
不要在这里得到注释。这可能是不安全的,与许多API一样,在任何实现中都不是不安全的!。有趣的是,这个答案得到了10多张反对票,而带有“eval”的答案得到了15多张赞成票,而它们的“不安全”方式完全相同。当没有机会对用户输入进行评估时,根本就没有风险!使用函数构造函数代替“eval”是非常好的,而且做起来更加优雅。升级投票是因为上面的解决方案会失败,例如:{'section':“24'}
变成:{“section”:“24'}
并且不会解析。这应该是最重要的答案。完美的解决方案。正在尝试从html的脚本标记中刮取一个JSON字符串,该标记包含换行符和空格。节省了我的时间!对我来说,这很有效JSON.stringify(一些jsonString)
你的答案会篡改数据。一个好的答案会改变数据结构,而不是数据结构中的数据。@ssube,首先想到的是用双引号替换单引号,这是一种粗心大意的方法,因为它会破坏字典值。例如,“title”:“妈妈的朋友”“
将成为的“标题”:“妈妈的朋友”“
,这当然是无效的!我应该对你的答复投反对票,但我反对投反对票。这个评论值得更多。嗨@Apostolos我同意你的观点,现在我面临同样的问题。你能找到解决办法吗?提前感谢是的,我在@Selvam找到了一个解决方案,但是已经很久了,但我不记得是什么了,因为我现在很少使用JSON。对不起(没问题。如果您认为eval在这种情况下不是邪恶的,那么感谢您对@ApostolosEven的响应,JSON.parse总是更快:@Arkanoid您链接的基准不适用于这种情况,因为它只使用有效的JSON(由于JSON.stringify),这也会修改数据。{'a':“a'a}
将变成{a:“a”a}
json = ( new Function("return " + jsonString) )();
var str = "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);