javascript 将字符串解析为带单引号的JSON?

fnx2tebb  于 2022-12-17  发布在  Java
关注(0)|答案(9)|浏览(272)

我有一根绳子

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

如何将上面的字符串(str)解析为JSON对象?
这看起来像是一个简单的解析,但它不起作用。

dldeef67

dldeef671#

JSON standard需要双引号,不接受单引号,解析器也不接受。
如果字符串中没有转义单引号(这通常是不可能的,但这不是JSON),那么可以简化str.replace(/'/g, '"'),最终应该得到有效的JSON。

fykwrbwg

fykwrbwg2#

我知道这是一篇老文章,但是您可以使用JSON5来实现此目的。

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>
s2j5cfk0

s2j5cfk03#

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

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

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

5hcedyr0

5hcedyr04#

JSON中不允许使用单引号作为键。您需要使用双引号。
对于您的用例,这可能是最简单的解决方案:

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

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

axzmvihb

axzmvihb5#

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

这为我解决了问题。

rdrgkggo

rdrgkggo6#

大概是这样的

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;
<div id="result"></div>
laximzn5

laximzn57#

// 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);

其他答案在足够多的情况下都不起作用,例如上面引用的案例:"title": "Mama's Friend",它会很天真地转换撇号,除非您使用regex。JSON5会希望删除单引号,从而引入类似的问题。
警告:虽然我相信这是兼容的所有情况下,将合理地出现,并工程往往比其他答案,它仍然可以打破理论。

whlutmcx

whlutmcx8#

如果您假设将显示单引号中的值,则应改为:

str = str.replace(/\'/g, '"');

您可以使用以下命令保持单引号的显示:

str = str.replace(/\'/g, '\&apos;\');


它是single quote的HTML等价物。

olmpazwi

olmpazwi9#

json = ( new Function("return " + jsonString) )();

相关问题