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 对象中使用null
。 JSON.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 我想是规范落后于实现的一个案例?
嗯,我确定我提供的值始终是 string
或 null
。由于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.parse 错误:“类型 'null' 不可分配给类型 'string'。”