转义字符串中的JSON控制字符

时间:2014-04-16 14:21:31

标签: java json string parsing escaping

在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字符串中添加另一个反斜杠\是正确的,创建像“\ n”或“\ t”这样的字符串不会对JSON字符串的外观产生任何影响吗?

1 个答案:

答案 0 :(得分:7)

  

以不同的方式处理字符串外的控制代码是否正确   字符串中的控制代码?

JSON specification

  

JSON文本是一系列令牌。这组令牌包括六个   结构字符,字符串,数字和三个文字名称。

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

  

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

您的\n\t和其他人(实际上规范定义了其中4个)被视为空格,因此您可以根据需要在上述字符周围放置尽可能多的内容。

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

  

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

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