JSON Unicode转义序列-应该使用小写还是大写?

10

我正在阅读RFC 4627,但我无法确定以下内容是否属于有效的JSON。考虑以下最简单的JSON文本:

["\u005c"]

问题在于小写字母。 根据RFC的文本,这是允许的:
任何字符都可以被转义。如果该字符在基本多文种平面(U+0000到U+FFFF)中,则可以将其表示为六字符序列:反斜杠、小写字母u,后跟四个十六进制数字,这些数字编码了字符的代码点。十六进制字母A到F可以是大写或小写。例如,仅包含一个反斜杠字符的字符串可以表示为"\u005C"。
(重点是由我强调的)
问题是RFC还包含了此语法。
char = unescaped /
       escape (
           %x22 /          ; "    quotation mark  U+0022
           %x5C /          ; \    reverse solidus U+005C
           %x2F /          ; /    solidus         U+002F
           %x62 /          ; b    backspace       U+0008
           %x66 /          ; f    form feed       U+000C
           %x6E /          ; n    line feed       U+000A
           %x72 /          ; r    carriage return U+000D
           %x74 /          ; t    tab             U+0009
           %x75 4HEXDIG )  ; uXXXX                U+XXXX

其中HEXDIG在RFC 4234中被定义为

HEXDIG         =  DIGIT / "A" / "B" / "C" / "D" / "E" / "F"

这个内容只包含大写字母。

就我所了解的,大多数JSON解析器都接受大小写字母。

问题:到底哪个是正确的?是否存在矛盾,RFC中的语法需要修正?

1个回答

11

认为这是RFC 4234的这一部分所解释的:

ABNF字符串不区分大小写,这些字符串的字符集是US-ASCII。

因此:

    rulename = "abc"

而且:

    rulename = "aBc"

将匹配 "abc", "Abc", "aBc", "abC", "ABc", "aBC", "AbC" 和 "ABC"。

另一方面,后续部分并不是非常清晰:

要指定大小写敏感的规则,请逐个指定字符。

例如:

    rulename    =  %d97 %d98 %d99
或者
    rulename    =  %d97.98.99
HEXDIG规则的情况下,它们一开始就是单个字符 - 但是它们被字面指定为"A"等,而不是%d41,因此我猜测这意味着它们不区分大小写。这不是我读过的最清晰的规范 :(

这难道不是指编写其他语法的语法吗?我的意思是它允许HEXDIGheXdIG可以互换使用,但肯定不能像"A"一样涵盖语法中的所有字符,否则你就无法定义任何区分大小写的语言了! - Daniel Frey
@DanielFrey:我不这么认为——那是RFC的另一个部分:“规则名称不区分大小写”。虽然我同意这一点远非明显。 - Jon Skeet
+1 在你修改之前,我已经写了第一条评论。现在随着修改,它变得有意义了,而且我同意这不是最清晰的规范 :) - Daniel Frey
JSON定义RFC 4627中的所有区分大小写的关键字都使用单个字符提供(在其后的ASCII文字中),例如false = %x66.61.6c.73.65 ; false - silmeth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接