为什么json.parse会中断?以及如何解决

时间:2019-05-21 05:02:11

标签: javascript python

我从服务器将以下数据从服务器输入到我的js代码中。

{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxxx\",\"+91xxxxxxxxx\"]","message": "This is a test"}]}

我的代码以以下方式解析上述json字符串。

data = '{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxx\",\"+91xxxxxxxx\"]","message": "This is a test"}]}'
parsed = JSON.parse(data);

这将引发以下异常

Uncaught SyntaxError: Unexpected token + in JSON at position 54
    at JSON.parse (<anonymous>)
    at eval (eval at <anonymous> (entry.html:2), <anonymous>:1:6)
    at entry.html:298

我做了一些进一步的挖掘,发现了json字符串的来源。 这是我的python代码输入的字符串

data = {"recipients": "[\"+91xxxxxxxxx\",\"+91xxxxxxxx\"]"} # This data comes in from my database, and I can't do anything about what quotes are used.
javascript_supplied_data = json.dumps(data) #This data goes to the frontend via webhook

我尝试通过this在线查看器将相同的数据放入json视图中,但没有引发任何错误并正确显示了数据。

我不明白的是,我正在python代码中执行json.dumps,因此字符串响应应该是json可解析的。那么为什么JSON.parse会引发此错误?

在python端或javascript端的json库是否有问题,还是我的菜鸟太多了?。

请帮助我找出导致此问题的原因以及解决方法。

注意:我无法控制来自服务器的字符串。

3 个答案:

答案 0 :(得分:5)

当您具有有效的JSON并将其放入字符串文字中时,JavaScript中文字符号所处理的转义符会使字符串有所不同。反斜杠被解释为用于转义下一个字符。

因此,要么必须经过字符串文字并将所有反斜杠加倍,要么可以将String.raw应用于字符串文字作为模板字符串:

var data = String.raw`{"triggers": [{"message_type": "sms","recipients": "[\"+91xxxxxxxx\",\"+91xxxxxxxx\"]","message": "This is a test"}]}`;
var parsed = JSON.parse(data);
console.log(parsed);

但是请注意,您在问题开始时发布的JSON有效。

另一方面,您得到的错误表明仅在第一个\"之前的+被解释为"。这意味着从服务器接收到字符串时,\实际上不存在。这通常是由服务器端的类似转义问题引起的,程序员打算将反斜杠发送给客户端,但实际上只是逃避了服务器上的",导致仅将"发送给客户端,而不发送给\"

答案 1 :(得分:0)

转义序列时,您必须在此处使用单引号。

如果我们在此处对转义序列使用双引号,则会导致

"recipients": "["+91xxxxxxxx","+91xxxxxxxx"]"

双引号内的双引号,这就是代码中断的原因。

data = '{"triggers": [{"message_type": "sms","recipients": "[\'+91xxxxxxxx\',\'+91xxxxxxxx\']","message": "This is a test"}]}';

parsed = JSON.parse(data);

console.log(parsed)

答案 2 :(得分:0)

如果您想用双引号括起来,例如“ + 91XXXXXX”,则可以使用双反斜杠

data = '{"triggers": [{"message_type": "sms","recipients": " [\\"+91xxxxxxxx\\",\\"+91xxxxxxxx\\"]","message": "This is a test"}]}';parsed = JSON.parse(data);console.log(parsed)