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

Cod*_*mon 54 javascript json

我有一个字符串

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.

  • @ssube,用双引号全局替换单引号是第一个想到的,并且是一种马虎的方法,因为它可以破坏字典值。例如 `'title': "Mama's Friend"` 将变成 `"title": "Mama"s Friend"`,这当然是无效的!我应该否决你的回复,但我反对否决。这个评论更有价值。 (12认同)
  • 你的回答会篡改数据。一个好的答案会改变结构,而不是数据结构内的数据。 (8认同)

小智 12

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

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

  • 之所以提出投票,是因为上述解决方案将因以下内容而失败:`{'section':“ 24'”}`变为:{{section“:” 24“”}`并且不会解析。 (4认同)

小智 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()

  • 即使您认为 eval 在这种情况下并不邪恶,JSON.parse 总是更快:https://jsperf.com/json-parse-vs-eval/3 (3认同)
  • @Arkanoid您链接到的基准不适用于这种情况,因为它仅使用有效的JSON(由于JSON.stringify) (2认同)

Vai*_*gre 8

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

这为我解决了这个问题。

  • 这也会修改数据。`{'a':"A'A"}` 将变为 `{"a":"A"A"}` (3认同)

Jon*_*ink 7

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

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

str = '{"a":1}';
Run Code Online (Sandbox Code Playgroud)

来源

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


aup*_*aup 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;
Run Code Online (Sandbox Code Playgroud)
<div id="result"></div>
Run Code Online (Sandbox Code Playgroud)


Sea*_* AH 7

// 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 将希望删除单引号,从而引入类似的问题。

警告:虽然我相信这与所有合理出现的情况兼容,并且比其他答案更有效,但理论上它仍然可能会崩溃。