我在下面提到的JSON是有效的JSON。
我完成了JSON解析器的编写,该解析器仅允许String和Object这两种基本数据类型。让我展示一下在出现歧义的情况下解析器的作用。
parse("{ "Mon": "weekday", "Tue": "weekday", "Sun": "weekend" }").get("Sun");//return value: "weekend"
parse("{ "weekday" : { "Mon": "1", "Tue": "2"} }").get("weekday").get("Mon");//return value: "1"
函数parse
返回一个字典,我们可以从中获取想要的内容。
我发现我没有使用任何逗号或冒号来解析JSON,然后我猜想这些表示法对于支持全数据类型的JSON解析器可能也是多余的,对吗?如果是的话,它们是出于可读性,对吧?
PS:如果它是无效的JSON怎么办?答案相同吗?
答案 0 :(得分:1)
根据RFC 8259 (The JavaScript Object Notation (JSON) Data Interchange Format),冒号和逗号被列为名称分隔符和值分隔符< / strong>。
请参见第2. JSON Grammar节:
These are the six structural characters:
begin-array = ws %x5B ws ; [ left square bracket
begin-object = ws %x7B ws ; { left curly bracket
end-array = ws %x5D ws ; ] right square bracket
end-object = ws %x7D ws ; } right curly bracket
name-separator = ws %x3A ws ; : colon
value-separator = ws %x2C ws ; , comma
因此,它们都是具有特定用途的有效JSON分隔符。
请参阅第9. Parsers节:
A JSON parser transforms a JSON text into another representation. A
JSON parser MUST accept all texts that conform to the JSON grammar.
A JSON parser MAY accept non-JSON forms or extensions.
An implementation may set limits on the size of texts that it
accepts. An implementation may set limits on the maximum depth of
nesting. An implementation may set limits on the range and precision
of numbers. An implementation may set limits on the length and
character contents of strings.
从“解析器”部分,可以了解到没有提到跳过(忽略)冒号和/或逗号,因为这样的解析器将不符合JSON语法。
从以上各节总结一下,可以肯定地说,任何忽略JSON语法的决定肯定是完全主观的,暗示着此类解析器不符合语法。
因此,这回答了冒号或逗号不是多余的并且它们是JSON语法的必要部分的问题。
希望有帮助!
答案 1 :(得分:0)
Json是JavaScript语法的子集。它是非常小的子集,因此并非所有标点都是必需的。但是使用全表达式语法是必要的,因为在很多情况下,除非它们之间没有逗号,否则您不知道列表中一个表达式在哪里结束而下一个表达式在哪里开始。
(当然还有逗号的替代方法。正如Ira Baxter所指出的那样,Lisp S表达式不需要逗号,但是它们使用了更多的括号,很多人发现括号比逗号更嘈杂。)
只要您认为能够将JSON插入JavaScript文本很重要,就需要保留JavaScript格式,逗号和冒号以及所有其他内容。
JSON的一个重要方面是正确的JSON是 safe 。当然,您不能将未经测试的JSON插入可执行字符串中。那太疯狂了。但是,JSON解析器应该验证其输入,并且经过验证的JSON对于代码安全无虞。如果您的解析器允许您省略逗号,则不再是这种情况。