我的问题标题可能有些令人困惑,所以我会试着解释一下我的情况:
从外部源(在本例中是Web Socket连接),我收到一个需要在JavaScript中解析为对象的JSON字符串。
我不有可能修改字符串在外部源中的构建方式。我知道有几个选项可以解析,比如使用jQuery,eval()
(并不总是推荐)等等...
在这种情况下,我只使用JSON.parse()
,因为它似乎工作正常。
今天我遇到了双字引号在字符串中被转义的问题。请看以下示例:
var readonly ='{“nam”:“jso \”n“}';
假设readonly
是从外部源接收的字符串(顾名思义,我无法修改字符串在此级别的格式化方式)。这实际上是有效的JSON,因为我真的没有理由向外部源的开发者抱怨他们应该修改他们的。
现在我想将这个字符串解析为一个对象。如前所述,我使用JSON.parse()
:
var my_object = JSON.parse(readonly);
不幸的是,这失败了,浏览器的控制台抛出了一条错误消息。
经过研究,我发现我需要添加另一个反斜杠以逃避双引号以使其工作。所以我需要找到一种方法将readonly
字符串更改为:
'{ “南”: “JSO \\的” n“}'
我现在的问题是:如何将这些额外的反斜杠添加到我不了解其内容的字符串中?
修改 根据评论,这里有一些额外的信息: 我实际上收到的字符串不仅包含json。固定数量的字符位于json的后面。这可能就是一个例子:
'XXXX { “南”: “JSO \” N“} XXXXXX'
我使用substring
从该字符串中提取实际的json。
答案 0 :(得分:2)
字符串不正确 - 需要双重转义。
var readonly = '{"nam":"jso\\"n"}';
^^
请记住,您将此字符串定义为javascsript字符串,这意味着它由Javascript ** FIRST *解析/评估。这意味着字面上存储在var中的字符将只是{"nam":"json"n"}
- JS解析器将删除反斜杠。现在它已损坏/无效的json。
通过加倍反斜杠,确保其中一个反斜杠能够存活并存在,使其成为有效的JSON,然后可以对其进行解析。