在用Java编写JSON解析器时,我遇到了一个"化妆品"问题:
在JSON规范中,明确指出Javascript控制字符与C和Java中的相同,例如\n或\t。我遇到的问题是,当JSON字符串中有控制代码时(因此在引号中:"property":"value"),则显示的JSON代码会出错,因为控制字符正在更改打印,例如创建新行或创建选项卡。
一个例子:
String s = "{nt"property1": "The quick brown foxnjumps over the lazy dog",nt"property2":"value2"n}"
打印为:
{
"property1": "The quick brown fox
jumps over the lazy dog",
"property2": "value2"
}
解决方案如下:
String s = "{nt"property1": "The quick brown fox\njumps over the lazy dog",nt"property2": "value2"n}"
"正确"打印为:
{
"property1": "The quick brown foxnjumps over the lazy dog",
"property2": "value2"
}
因此,我的问题是:将字符串外的控制代码与字符串内的控制代码区别对待是否正确?在JSON字符串中,在任何控制字符之前添加另一个反斜杠,创建不会对JSON字符串的外观产生任何影响的字符串,这正确吗?
将字符串外的控制代码与字符串中的控制代码?
JSON规范规定
JSON文本是一系列标记。这套代币包括六个结构字符、字符串、数字和三个字面名称。
它们是{
、[
、}
、]
、:
和,
。然后声明
在六个结构字符中的任何一个之前或之后都允许有不重要的空格。
您的n
、t
和其他字符(实际上规范定义了其中的4个)被视为空白,因此您可以在上面的字符周围放置任意数量的字符。
JSON字符串之外没有控制字符的概念。这些只是空白字符。是的,他们被区别对待。
在JSON字符串中添加另一个反斜杠
是否正确在任何控制字符之前,创建像
"n"
或"t"
这样的字符串不会对JSON字符串的外观产生任何影响吗?
在您的示例中,您正在编写String
文字。如果您确实想在JSON字符串中写入n
,则需要在Java String
文本中写入\n
,对于其他转义序列也是如此。JSON生成器必须在要转换为JSON字符串的Java String
中找到任何空白,并相应地对其进行转义。JSON解析器必须在其解析的JSON字符串中找到文本n
(或其他任何内容),并在其创建的Java String
中对其进行适当转换。