JSON中的空格字符是否无关紧要?

68

空格、制表符和回车符等空白字符在 JSON 字符串中会被忽略吗?

例如,{"a":"b"}{"a" : "b"} 是否相等?


空格不是技术上的空白字符。 - Falmarri
31
从技术上讲,你的大脑应该将“blank”解析为“空格”。 - mk12
2个回答

79

是的,在双引号字符串字面量外部的空格在语法中被忽略。具体来说,JSON语法中RFC 4627ws生产规则如下:

Insignificant whitespace is allowed before or after any of the six
structural characters.

   ws = *(
             %x20 /              ; Space
             %x09 /              ; Horizontal tab
             %x0A /              ; Line feed or New line
             %x0D                ; Carriage return
         )

谢谢。我已经阅读了RFC,但不确定这是什么类型的语法表示语言 - 具体来说,*代表什么。 - nomen
2
  • = 零个或多个(来自正则表达式符号)
- kevinarpe
数字值中嵌入空格怎么办:{"a":12}等同于{"a":1 2}吗?我理解“任何六个结构字符之前或之后都允许有不重要的空格”这一定义意味着在数字或日期值内不允许有空格。 - aeropapa17
1
@aeropapa17 没错,因为1和2都不是JSON结构字符。 - Greg Hewgill
规范中使用的语法符号是增强型BNF(巴科斯-诺尔范式),其定义在https://www.rfc-editor.org/rfc/rfc4234。JSON RFC中有一个链接指向它,但很容易被忽略。 - sengi
如果你对BNF/ABNF/EBNF符号表示法不熟悉的话,json.org上的“铁路”语法图可能更容易理解。不过还是有点棘手,因为你仍然需要注意到在json.org页面的最后定义的“空白”可以为空。(对于任何与实现相关的事情,我会使用RFC文档,以防json.org和实际标准文档之间存在差异、版本不一致或其他问题。) - sengi

7
在标准的JSON中,字符串字面量之外的空格会被忽略,正如已经提到的那样。
然而,由于您的问题被标记为C#,我应该指出在C#/.NET中至少有另一种情况,即JSON中的空格确实很重要。 使用一个特殊的<__type>属性来支持反序列化到正确的子类。这个属性需要是一个对象中的第一个属性,并且在属性名称和前面的{之间没有空格。请参见这个以前的线程: DataContractJsonSerializer doesn't work with formatted JSON? 至少在.NET 4中,我已经测试了无空格的要求是真实的。也许在将来的版本中,这将被更改以使其更符合JSON标准?

危险,威尔·罗宾逊! - wprl

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