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



在用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文本是一系列标记。这套代币包括六个结构字符、字符串、数字和三个字面名称。

它们是{[}]:,。然后声明

在六个结构字符中的任何一个之前或之后都允许有不重要的空格。

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

JSON字符串之外没有控制字符的概念。这些只是空白字符。是的,他们被区别对待。

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

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

最新更新