【问题标题】:Escaping of JSON control characters within string转义字符串中的 JSON 控制字符
【发布时间】:2014-05-31 11:43:12
【问题描述】:

在用 Java 编写 JSON 解析器时,我遇到了一个“装饰性”问题:

在 JSON 规范中明确表示 Javascript 控制字符与例如在 C 和 Java 中,如 \n 或 \t。我遇到的问题是,当 JSON 字符串中有控制代码时(所以在引号内:“property”:“value”),那么显示的 JSON 代码就会混乱,因为控制字符正在改变打印,例如\n 创建一个新行或 \t 创建一个制表符。

一个例子:

String s = "{\n\t\"property1\": \"The quick brown fox\njumps over the lazy dog\",\n\t\"property2\":\"value2\"\n}"

打印为:

{ "property1": "The quick brown fox jumps over the lazy dog", "property2": "value2" }

解决方案如下所示:

String s = "{\n\t\"property1\": \"The quick brown fox\\njumps over the lazy dog\",\n\t\"property2\": \"value2\"\n}"

“正确”打印为:

{ "property1": "The quick brown fox\njumps over the lazy dog", "property2": "value2" }

所以我的问题是:将字符串外的控制代码与字符串内的控制代码区别对待是否正确?在 JSON 字符串中在任何控制字符之前添加另一个反斜杠 \ 是否正确,从而创建不会对 JSON 字符串的外观产生任何影响的字符串,例如“\n”或“\t”?

【问题讨论】:

  • 呃,你为什么不用 JSON 库?
  • 为什么人们要自己造车而不是买车?我不知道,你呢?...嗯,实际上是因为没有汽车可以做我想做的事。 ;)
  • 简单,速度,各种各样的东西......但我不是在这里讨论我的问题,而不是解决它。
  • 不,我不会。我唯一要做的就是对杰克逊进行逆向工程,但我希望在这里能得到一个快速的答案。那么,那么……
  • 这不是重新发明轮子。它正在建造一辆自己的汽车。实际上,我读过 RFC 7159,它是我读过的最糟糕的 RFC 之一。正如我所说:JSON 标准中没有解决上述问题。所以连一个运转的轮子都没有,你明白吗?

标签: java json string parsing escaping


【解决方案1】:

区别对待字符串之外的控制代码是否正确 字符串中的控制代码?

JSON specification 状态

JSON 文本是一个标记序列。该组令牌包括六个 结构字符、字符串、数字和三个文字名称。

这些是{[}]:,。然后它说

在六个结构字符之前或之后允许有无关紧要的空格。

您的\n\t 和其他(实际上规范定义了其中 4 个)被视为空白,因此您可以在上述字符周围放置任意数量的空格。

在 JSON 字符串之外没有控制字符的概念。这些只是空白字符。是的,他们的待遇不同。

在 JSON 字符串中添加另一个反斜杠 \ 是否正确 在任何控制字符之前,创建像 "\n""\t" 这样的字符串 不会对 JSON 字符串的外观产生任何影响?

在您的示例中,您正在编写 String 文字。如果您真的想在 JSON 字符串中写入 \n,则需要在 Java 的 String 文字中写入 \\n,其他转义序列也类似。 JSON 生成器必须在它转换为 JSON 字符串的 Java String 中找到任何空格并相应地对其进行转义。 JSON 解析器必须在它解析的 JSON 字符串中找到文字 \n(或其他任何东西),并在它创建的 Java String 中适当地转换它。

【讨论】:

  • 注意:RFC 4627 已被 RFC 7159 淘汰
  • 说实话,我知道字符串之外的字符可以忽略。我的问题实际上解决了 JSON 字符串中的控制字符(如 \n 和 \t)影响打印输出的方式的问题。不过还是谢谢你。
  • @Marcus 对,它们必须用 JSON 字符串转义。 JSON 规范不允许它们在 JSON 字符串中未转义。
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2017-08-17
  • 2020-06-24
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2019-12-10
  • 2019-03-07
相关资源
最近更新 更多