使用转义为JSON

时间:2016-02-03 15:22:31

标签: javascript json escaping

我的问题标题可能有些令人困惑,所以我会试着解释一下我的情况:

从外部源(在本例中是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。

1 个答案:

答案 0 :(得分:2)

字符串不正确 - 需要双重转义。

var readonly = '{"nam":"jso\\"n"}';
                           ^^

请记住,您将此字符串定义为javascsript字符串,这意味着它由Javascript ** FIRST *解析/评估。这意味着字面上存储在var中的字符将只是{"nam":"json"n"} - JS解析器将删除反斜杠。现在它已损坏/无效的json。

通过加倍反斜杠,确保其中一个反斜杠能够存活并存在,使其成为有效的JSON,然后可以对其进行解析。