【问题标题】:Why doesn't my attempt to escape quotation marks in JSON work?为什么我在 JSON 中转义引号的尝试不起作用?
【发布时间】:2014-04-10 10:13:37
【问题描述】:

我正在使用 JQuery.parseJSON 函数解析 JSON 字符串,因为我已经在我的代码中做了很多次。不过,在这种特殊情况下,我得到:Uncaught SyntaxError: Unexpected token R。在我的 JSON 格式字符串中,唯一存在的大写 R 紧跟在转义引号 ... \"R ... 之后,就像这样。这似乎是由其他任何事情引起的巧合,但据我所知,我完全遵循了 json.org 上描述的正确语法。

编辑:

我尝试在硬编码测试中手动删除 \" 的出现,并将字符串格式完美地转换为适当的 Javascript 对象。也就是说,我的\"绝对是这里的问题……

var myObject = $.parseJSON(myString);

编辑 2:

我的字符串有问题的区域在这里显示,无论是在工作状态下,还是在非工作状态下。首先是有问题的:

{"lineID":33,"boxID":10,"title":"My text with the \"Ruining Part\""}

然后是工作的:

{"lineID":33,"boxID":10,"title":"My text with the Ruining Part"}

最后我如何将我的 javabean 对象格式化为 JSON 字符串。

String jsonObjectAsString = new Gson().toJson(myJavaBeanObject);

【问题讨论】:

  • 向我们展示您的整个 JSON 消息
  • 发布导致此问题的 JSON 字符串会有所帮助。
  • 一开始你是如何创建 JSON 的?您使用的是库函数还是自己开发的东西?
  • 我的整个 JSON 字符串很长,可能包含敏感信息。但我会在问题编辑更新中对有问题的区域进行编辑。我正在使用 Gson 从 JavaBean 对象格式化。
  • 像 GregL 的回答一样双重转义它。即\\"Ruining Part\\"

标签: javascript json escaping


【解决方案1】:

如果字符串是硬编码的,您可能需要转义字符串中的反斜杠,以便解析的最终字符串有一个反斜杠,后跟一个双引号。否则,浏览器会认为您正在尝试转义字符串中的双引号,而这无济于事。

所以把你的字符串改成:

...\\"R...

【讨论】:

  • +1 - 完全正确 - JSON.parse('{"hello":"This is a \"String"}') 返回 SyntaxError: Unexpected token SJSON.parse('{"hello":"This is a \\"String"}') 正确解析传递的 JSON 字符串。
  • 我不完全明白。我在解析为 JSON 格式之前的字符串是My text with the "Ruining Part"。由 Gson 格式化,变为My text with the \"Ruining Part\"。不应该是My text with the "Ruining Part" 再次自动解析成javascript中的对象吗?还是 Gson 和 javascripts 的解析方式不匹配?而您的建议,它不会逃脱 Gson 生成的反向固相线,并且不做任何事情来逃避实际的引号吗?
  • 当你只使用 \" 时,那个 \ 将被 JavaScript 的字符串解析器使用(作为 " 字符的转义字符)并且 JSON 解析器将只得到 "。但是当你使用 \\ ",JavaScript 字符串解析器使用一个 \ (作为下一个 \ 的转义符)并且 JSON 解析器将正确接收 \"
  • 我怀疑问题的出现是因为 Gson 的序列化在 Java 领域内很好,但是如果您直接在 <script> 标记或其他东西中将该 Java 字符串写入客户端,那么它没有被正确转义再次对 Javascript 有效。
  • 这不是 JSON 的失败。问题是您在 Javascript 文件中填充了一个有效的 JSON 字符串没有正确尊重 Javascript 处理字符串的方式。如果您通过 AJAX 检索 JSON,它可能会为您转义,JSON.parse() 可以正常工作。您可以将您所做的视为“将 JSON 序列化为 JS 字符串”,但您没有正确序列化它。这更有意义吗?
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 2016-10-27
  • 2016-10-16
相关资源
最近更新 更多