我从服务器将以下数据从服务器输入到我的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库是否有问题,还是我的菜鸟太多了?。
请帮助我找出导致此问题的原因以及解决方法。
注意:我无法控制来自服务器的字符串。
答案 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)