【问题标题】:JSON.parse can't recognize \" (backslash and quote) in string to parseJSON.parse 无法识别要解析的字符串中的 \" (反斜杠和引号)
【发布时间】:2018-09-01 20:36:23
【问题描述】:

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

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

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

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

还有我的错误:

未捕获的语法错误:JSON 中第 25 位的意外标记 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("\\\"", "\\\\\\\"");

【问题讨论】:

  • 这可能是服务器端的问题。您应该使用标准 JSON 库,而不是尝试自己序列化。
  • 但就像我在 json.org 上读到的那样,它应该认识到 \" 标志并且不应该有问题。但另一方面,没有机会在字符串中使用引号?
  • 当您在带有嵌入引号的字符串上使用 console.log() 时,它不会显示将其作为文字或 JSON 输入所需的反斜杠。
  • 发布创建 JSON 的代码。
  • 文档推荐使用 Json.NET 而不是 JavaScriptSerializer

标签: javascript c# json


【解决方案1】:

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

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

【讨论】:

  • 谨慎使用!里面也不能包含`。建议改为序列化 JSON。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,您的解决方案有效。但它很难编程,因为我使用 API 从我得到这些字符串。
  • 这意味着你不能添加双反斜杠?
  • 您使用的是哪个 API?
  • 完全正确。我需要将它添加到序列化字符串或只是删除那个 \" 但我不想。或者这是唯一的方法?API 示例:api-v3.mojepanstwo.pl/dane/krs_podmioty/23302.json?layers=graph
  • 是的,这是唯一的方法,因为 '\' 被用作转义序列的一部分,这就是为什么您的服务器无法识别字符串中的双引号的原因。它将 \" 视为转义序列。
【解决方案3】:

服务器应该提供可以直接解析的正确序列化 JSON,而客户端不必先对数据进行棘手的字符串操作。 (例如,如果你没有在服务器端修复它,那么它对fetch(...).then(res =&gt; res.json()) 无效)

【讨论】:

    【解决方案4】:

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

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

    之所以特殊,是因为它有正则表达式的特殊含义。

    1. \hello时,你的输出是hello
    2. 在编写\'hello 时,您的输出将是'hello
    3. \"hello\"时,你的输出是"hello"

    我认为您应该首先选择您希望data 属性的格式。

    您希望数据是字符串吗?大批?目的?一个字符串,它的所有引号都是双引号还是单引号?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多