JSON.parse 允许 null 作为值

Posted

技术标签:

【中文标题】JSON.parse 允许 null 作为值【英文标题】:JSON.parse allows null as value 【发布时间】:2018-03-09 22:04:48 【问题描述】:

我将 null 传递给 JSON.parse(),尽管记录的第一个参数说它应该是一个字符串值,但它仍然可以提供 null

即使文档声明这是针对字符串的,为什么这不会引发错误,并且可以在多个浏览器中安全可靠地使用它吗?

【问题讨论】:

查看下面的答案***.com/questions/21120999/representing-null-in-json 我觉得这个问题有所不同,因为它谈到在 JSON 对象中使用 nullJSON.stringify 已处理的 JSON 对象会生成字符串。我只是将null 直接扔到我的JSON.parse() 中。 我假设parse 可能会在内部将给定值转换为字符串,即"null",这是一个有效的 JSON 值。 好吧,如果是这样的话,我想知道这有多可靠cross-browser JSON.parse("null") 或 JSON.parse(null) 它们都被转换为“null”,这是一个有效的 json,但如果你传递 JSON.parse('') 它将抛出异常,它是一个空字符串 【参考方案1】:

ECMAScript spec 表示JSON.parse 的第一步:

    JText 成为ToString(text)

这意味着它将把它给出的任何参数转换为一个字符串,并且null 转换为"null",这是null 的有效JSON 表示。

请注意,单个这样的 JSON 原语不应有效,JSON 字符串应包装在对象或数组中。但是解析器传统上对此并不松懈,部分原因是我认为它使实现更简单。

【讨论】:

所以我想这里最可靠的做法是在将输入值交给JSON.parse之前检查输入值是否为字符串,否则我会滥用它? “一个 JSON 字符串应该被包装在一个对象或数组中”——原始的 JSON 规范是这么说的,但不是很清楚。 rfc7159 更新它说:JSON 文本是一个序列化值。请注意,某些先前的 JSON 规范将 JSON 文本限制为对象或数组。 @Quentin 我想是规范落后于实现的一个案例? 嗯,我确定我提供的值始终是 stringnull。由于JSON.parse 接受两者,它们并不是真的无效。我想把它交给一个空值是不“合适的”。 @Stephan A null value 基本上意味着“无价值”,在这种情况下,您的代码确实不应该进入它尝试将“无价值”解析为 JSON 的分支,而是去做点别的。【参考方案2】:

见the specification:

    让 JText 为 ToString(text)。

它不要求第一个参数是字符串,它会尝试将其转换为字符串。

"" + null 会给你"null",这是一个包含有效 JSON 的字符串。

这是also in the spec:

Null:返回“null”。

【讨论】:

以上是关于JSON.parse 允许 null 作为值的主要内容,如果未能解决你的问题,请参考以下文章

JSON.stringify(),JSON.parse()

打字稿,JSON.parse 错误:“类型 'null' 不可分配给类型 'string'。”

带单引号和双引号的 JSON.parse 字符串?

带单引号和双引号的 JSON.parse 字符串?

Django CharField 作为主键仍然允许保存 Null 值

JSON对象及方法