JSON.parse无法识别\" (反斜杠和引用)在字符串中解析

时间:2018-03-23 08:12:25

标签: javascript c# json

我已经使用带有引号的对象序列化JSON,如下所示:

var bla = [
    { 
        "label": "person", 
        "id": "1", 
        "data": "bla means: \"lala\"" 
    }
];

我知道它在服务器端的外观。但是当我在浏览器中调试它时,我发现我收到了错误,因为它看起来如下:

var bla = [
    { 
        "label": "person", 
        "id": "1", 
        "data": "bla means: "lala"" 
    }
];

和我的错误:

  

Uncaught SyntaxError:位于25位置的JSON中的意外标记l   JSON.parse()

我读到JSON应该识别 \" https://www.json.org/

任何想法我应该在哪里纠正它?在服务器端,当我使用JavaScript序列化对象或客户端时?

修改

在服务器端,我使用C#库"System.Web.Script.Serialization" 要序列化的对象:

List<SomeObject> someObject= new List<SomeObject>();
        SomeObject bla1 = new SomeObject();
        bla1.id = "1";
        bla1.label = "person";
        bla1.label = "bla means: \"lala\"";
        someObject.Add(bla1);

var bla = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(someObject);

概要

我修复了服务器端的序列化字符串,因为我使用API​​来操作这个对象。 var bla = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(someObject).Replace("\\\"", "\\\\\\\"");

4 个答案:

答案 0 :(得分:3)

您可以尝试使用双反斜杠或三反斜杠,例如\\" or \\\"

var bla = [
    { 
        "label": "person", 
        "id": "1", 
        "data": "bla means: \\"lala\\"" 
    }
];

它会添加反斜杠并用双引号打印。

答案 1 :(得分:1)

服务器应该提供可以直接解析的正确的序列化JSON,而客户端不必首先对数据进行棘手的字符串操作。 (例如,如果您没有在服务器端修复它,那么它对resource.description_backend.write(:en, "Foo") resource.description_backend.write(:de, "bar") resource.description_backend.write(:fr, "dummy") ... Mobility.locale = :ja resource.description(fallback: [:nl, :de]) 无效)

答案 2 :(得分:1)

就我而言,我只使用String.raw()

JSON.parse(`{ "key": "\""}`) // fail
JSON.parse(String.raw`{ "key": "\""}`) // work

答案 3 :(得分:0)

我没有完全理解你的项目结构,但是:

反斜杠 \是javascript中的特殊字符。

它很特殊,因为它具有正则表达式的特殊含义。

  1. 撰写\hello时,您的输出将为hello
  2. 撰写\'hello时,您的输出将为'hello
  3. 撰写\"hello\"时,您的输出将为"hello"
  4. 我认为您应首先选择您希望如何格式化data属性。

    您希望数据是字符串吗?阵列?宾语?一个字符串,它将所有引号保持为double或single?

    看看这里 - https://www.w3schools.com/js/js_strings.asp

    并确定您要使用的字符串格式。

    如果你想转义一个字符(实际上意味着将它放在你的字符串中),你应该在这个字符之前添加\