使用单引号将字符串解析为 JSON?

IT技术 javascript json
2021-02-01 21:28:19

我有一个字符串

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

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

这似乎是一个简单的解析。虽然它不起作用。

6个回答

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

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

@ssube,用双引号全局替换单引号是第一个想到的并且是一种草率的方法,因为它可以破坏字典值。eg 'title': "Mama's Friend"will become "title": "Mama"s Friend",这当然是无效的!我应该拒绝您的回复,但我反对拒绝投票。这条评论更有value。
2021-03-10 21:28:19
是的,我在@Selvam 找到了一个解决方案,但这是很久以前的事了,但我不记得是什么了,因为这些天我很少使用 JSON 的东西。对不起!:(
2021-03-12 21:28:19
嗨@Apostolos 我同意你的看法,我现在面临同样的问题。你能找到解决办法吗?提前致谢
2021-03-22 21:28:19
你的回答会篡改数据。一个好的答案会改变结构而不是数据结构中的数据。
2021-03-26 21:28:19
没问题。感谢您回复@Apostolos
2021-03-26 21:28:19

我知道这是一篇旧帖子,但您可以为此目的使用JSON5

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
对我来说这有效 <script>JSON.stringify(some_jsonString)</script>
2021-03-16 21:28:19
这应该是最佳答案。
2021-03-21 21:28:19
赞成,因为上述解决方案将失败,类似于: {'section': "24'"} 这变成: {"section": "24""} 并且不会解析。
2021-03-26 21:28:19
你将如何实现这一点?我正在尝试使用 jsonlite 包读取 R 中的文件。
2021-04-07 21:28:19
完美的解决方案。试图从 html 的脚本标签中抓取一个 JSON 字符串,其中包含换行符和空格。拯救了我的一天!
2021-04-08 21:28:19

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

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

由于 eval 解析器的工作方式,需要额外的括号。当 Eval 用于您可以控制的数据时,它并不是邪恶的。有关 JSON.parse 和 eval() 之间差异的更多信息,请参阅JSON.parse vs. eval()

即使你认为 eval 在这种情况下并不邪恶,JSON.parse 总是更快:jsperf.com/json-parse-vs-eval/3
2021-03-17 21:28:19
@Arkanoid 您链接到的基准测试不适用于这种情况,因为它仅使用有效的 JSON(由于 JSON.stringify)
2021-04-05 21:28:19

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

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

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

来源

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

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

这为我解决了这个问题。

这也会修改数据。{'a':"A'A"}会变成{"a":"A"A"}
2021-03-11 21:28:19