为什么Javascript不能从字符串文字解析这个JSON数组?

mad*_*fox 8 javascript jquery interpolation json jsp

我想做的很简单.将包含json对象的此数组解析为Javascript数组.

var merchantsJson = JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\u0022\u003C/div\u003E"}]');
Run Code Online (Sandbox Code Playgroud)

但unicode字符似乎打破了解析器.在chrome控制台中,我看到"Uncaught SyntaxError:Unexpected token <"

多一点信息.以上是代码评估的内容.实际上,代码包含一个jsp表达式.

var merchantsJson = JSON.parse('${jsonArr}');
Run Code Online (Sandbox Code Playgroud)

如果我删除单引号,没有问题,但eclipse给我一个"缺少分号"错误消息.是否有可能用我正在尝试的引号解析数组?

Exp*_*lls 12

插值${jsonArr}已经是一个JavaScript对象.当你把它包起来'${jsonArr}'把它变成一个字符串,你必须使用JSON.parse.

没有必要把它变成一个字符串.你可以这样做var merchantsArray = ${jsonArr}.JSON构造已经可以与JavaScript代码互操作.

  • @Juhana,如果JSON是可信的并且它实际上是合法的JS([并非所有JSON都是],这是一个正确的答案(http://stackoverflow.com/questions/23752156/are-all-json-objects-also-有效的JavaScript对象)).如果它不受信任,那么正确的答案是将JSON正确转换为JS字符串文字,这是其他答案建议(或尝试)的内容.正如你所说,他们不是治疗症状. (5认同)
  • Eclipse会抱怨它不是合法的JavaScript,但这是预期的,因为它不是JavaScript.这是一个可以生成JavaScript的模板. (3认同)
  • JSON不受信任,这就是它被引用的原因. (3认同)
  • 这是正确的答案.其他人都在治疗症状,而不是原因. (2认同)
  • @ikegami是的,你误解了它.它说虽然这些字符是非法的*作为符号*,但它们在编码时是合法的(即``foo\u2028bar"`既是合法的又是JSON和JS字符串.) (2认同)

Ber*_*rgi 8

因为"你的字符串文字中有一个额外的编码\u0022:

> '[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\u0022\u003C/div\u003E"}]'
[{"id":61693,"name":"Más"},{"id":61690,"name":"'"</div>"}]
Run Code Online (Sandbox Code Playgroud)

简而言之,字符串中的JSON无效.您需要通过使用转义字符串文字("'\u0022</div>")中的引号的unicode转义序列

JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\\u0022\u003C/div\u003E"}]'
//                                                               ^
Run Code Online (Sandbox Code Playgroud)

或转义引号字符("'\"</div>"):

JSON.parse('[{"id":61693,"name":"Más"},{"id":61690,"name":"\u0027\\\u0022\u003C/div\u003E"}]');
//                                                               ^^
Run Code Online (Sandbox Code Playgroud)

但是,实际上根本不需要使用JSON.只需将JS数组文字输出到您的代码中:

var merchantsJson = ${jsonArr};
Run Code Online (Sandbox Code Playgroud)


Rob*_*bok 6

试图取代\u\\u.如果不这样做,JSON解析器会收到已经解码的Unicode,这会创建污染的JSON.

  • 在JSON中使用*解码的Unicode*没有错...实际上它需要Unicode.唯一真正的问题是一个字符代表双引号,它关闭解析器正在解释的*"子字符串"*.这是唯一需要逃避的人. (4认同)

des*_*ien 3

这不是因为 \u003C,而是因为\u0022字符导致了问题,因为它是一个引号,JavaScript 将其视为字面意义上的字符串结尾。

您需要转义该字符:\\u0022

  • @AlejandroC:不,只有双引号才是问题所在。在字符串文字中使用什么引号并不重要,因为它已经是转义序列,因此它不会破坏主字符串。 (3认同)