我有以下数据从我的服务器传入我的 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 View 中在线查看器,它没有抛出任何错误并正确显示数据。
我无法理解的是,我正在 python 代码中执行 json.dumps,因此字符串响应应该是可解析的 json。那么为什么 JSON.parse 会抛出这个错误呢?
python 端或 javascript 端的 json 库有问题吗?还是我太菜鸟了?
请帮我找出导致此问题的原因以及如何解决它。
注意:我无法控制从服务器传入的字符串。
最佳答案
当您有有效的 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 是有效的。
另一方面,您收到的错误表明第一个 +
之前的 \"
被解释为 "
。这意味着当从服务器接收到字符串时,\
实际上并不存在。这通常是由服务器端类似的转义问题引起的,程序员打算将反斜杠发送到客户端,但实际上只是在服务器上转义了"
,这导致仅将 "
发送到客户端,而不是 \"
。
关于javascript - 为什么 json.parse 会中断?以及如何修复它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231377/