【问题标题】:Why does JSON.parse("foo") fail but JSON.parse(' "foo" ') success?为什么 JSON.parse("foo") 失败但 JSON.parse(' "foo" ') 成功?
【发布时间】:2019-11-05 02:53:34
【问题描述】:
当我尝试JSON.parse("foo") 时,我得到一个错误:
Uncaught SyntaxError: Unexpected token o in JSON at position 1
at JSON.parse (<anonymous>)
at <anonymous>:1:6
但是,当我使用JSON.parse('"foo"') 时,我可以得到预期的结果:
const value = JSON.parse('"foo"');
console.log(value)
那么为什么会这样呢?
【问题讨论】:
标签:
javascript
json
parsing
【解决方案1】:
您可以在json.org 找到有效 JSON 的原因。 JSON 可以表示 null、布尔值、数字、字符串、数组和对象。对于字符串,它们必须用双引号括起来。
JSON本身是一个字符串格式,所以当你指定一个JSON格式的字符串时,你需要:
- 用引号告诉 JavaScript 你正在指定一个字符串字面量。这些引号不是字符串值本身的一部分;它们只是分隔符。
- 在该字符串文字中使用双引号,以遵循字符串数据类型的 JSON 语法。
以下是JSON.parse 的一些正确参数示例:
JSON.parse("true")
JSON.parse("false")
JSON.parse("null")
JSON.parse("42")
JSON.parse("[13]")
JSON.parse('"hello"')
JSON.parse('{"name": "Mary"}')
但不是:
JSON.parse("yes")
JSON.parse("no")
JSON.parse("none")
JSON.parse('hello')
JSON.parse({"name": "Mary"})
因为参数在不是时会被强制转换为字符串,所以下面的方法也可以,但是会让人困惑(而且没用):
JSON.parse(true)
JSON.parse(false)
JSON.parse(null)
JSON.parse(42)
【解决方案2】:
发生这种情况是因为JSON.parse() 通过格式化使用syntaxis 给出的字符串以在Javascript 中声明值来返回一个值。因此,使用foo裸就如同强制转换一个未定义的变量。
还要注意,符号使用双引号 " 而不是单引号 '。这就是为什么JSON.parse('"foo"') 有效,而JSON.parse("'foo'") 无效。