Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串解析为带单引号的JSON?_Javascript_Json - Fatal编程技术网

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),那么可以使用simple
str.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);