在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字符串的外观产生任何影响吗?
答案 0 :(得分:7)
以不同的方式处理字符串外的控制代码是否正确 字符串中的控制代码?
JSON文本是一系列令牌。这组令牌包括六个 结构字符,字符串,数字和三个文字名称。
这些是{
,[
,}
,]
,:
和,
。然后说明
在六个结构字符中的任何一个之前或之后允许无关紧要的空格。
您的\n
,\t
和其他人(实际上规范定义了其中4个)被视为空格,因此您可以根据需要在上述字符周围放置尽可能多的内容。
JSON字符串之外没有控制字符的概念。这些只是空格字符。是的,他们的待遇不同。
在JSON字符串中添加另一个反斜杠
\
是否正确? 在任何控制字符之前,创建像"\n"
或"\t"
这样的字符串 不会对JSON字符串的外观产生任何影响吗?
在您的示例中,您正在编写String
文字。如果您真的想在JSON字符串中编写\n
,则需要在Java \\n
字面值中编写String
,对于其他转义序列也是如此。 JSON生成器必须在Java String
中找到它正在转换为JSON字符串的任何空格并相应地对其进行转义。 JSON解析器必须在它解析的JSON字符串中找到文字\n
(或其他任何内容),并在它创建的Java String
中正确转换它。