0

我想要一个以换行符分隔的 JSON 记录文件。所以记录中的换行符必须被转义。

我在 python 中的测试字符串确实被转义了。但它在所有 JSON 实现(如 Java 的)中都能得到保证吗?

4

3 回答 3

0

如果字符串被正确转义,只要实现符合JSON 规范,您就不必担心不同的实现。XML 和 JSON 等数据交换格式旨在解决互操作性的难题。作为简单的文本格式,它们在所有实现中都以类似的方式进行解释。

通过让我们指定编码格式,XML 与 JSON 相比提供了更精细的控制。然而,JSON 在这方面迫使我们遵循 unicode 编码。

注意:简而言之,不要担心 JSON 本身,但不要忘记在标准 ASCII 字符上使用 unicode 字符串(python <= 2.7 中的默认值)。这将确保 JAVA 以正确的方式解释字符串,因为 JAVA 默认具有 unicode 编码格式。

于 2013-07-12T16:42:05.743 回答
0

更正:我之前说过 JSON 规范是明确的,但事实证明,网站上的非正式 JSON 规范并没有我想象的那么明确,而且更明确的 RFC 实际上对术语“控制字符”的解释与Unicode 标准。

来自JSON RFC

所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。

请注意,此控制字符的定义与 unicode 不同:

http://www.fileformat.info/info/unicode/category/Cc/list.htm

Unicode 考虑字符 U+007F 到 U+009F 控制字符,而 JSON RFC 说它们不是。

这是一个在 unicode 中被视为换行符的字符表:

http://www.unicode.org/standard/reports/tr13/tr13-5.html

      Unicode   ASCII  EBCDIC*
CR    000D      0D     0D     0D
LF    000A      0A     25     15
CRLF  000D,000A 0D,0A  0D,25  0D,15
NEL*  0085      85     15     25
VT    000B      0B     0B     0B
FF    000C      0C     0C     0C
LS    2028      n/a    n/a    n/a
PS    2029      n/a    n/a    n/a

换行符中的两个,行 (U+2028) 和段落 (U+2029) 分隔符,不是unicode 控制字符。它们每个都属于自己的 unicode 类别。NEL 字符 (U+0085) 是 unicode 控制字符,但在 JSON 中不被视为控制字符。所有这三个都可以在 JSON 字符串中以非转义形式出现并代表它们自己。

您可以确信任何值得其盐分的 JSON 库都不会包含未转义的 CR 或 LF。您也不应该看到未转义的 VT 或 FF。但是,您会看到 NEL、LS 和 PS 字符在 JSON 中未转义。

(我以前认为 NEL 被认为是 JSON 中的控制字符。在此基础上,我向 Python 提交了这个错误报告,在那里我向我指出了我的错误:http: //bugs.python.org/issue21194

于 2014-04-10T09:55:04.483 回答
-1

根据JSON 规范

字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串与 C 或 Java 字符串非常相似。

所以是的,它们在所有符合标准的实现中都被转义了。

于 2013-07-12T12:13:00.820 回答