我们知道JSON.parse
解析字符串化的JSON
,但如果变量已经JSON
并且您尝试JSON.parse
,则会抛出错误:
> a
[]
> a = JSON.parse(a)
SyntaxError: Unexpected end of input
at Object.parse (native)
at repl:1:10
at REPLServer.defaultEval (repl.js:132:27)
at bound (domain.js:254:14)
at REPLServer.runBound [as eval] (domain.js:267:12)
at REPLServer.<anonymous> (repl.js:279:12)
at REPLServer.emit (events.js:107:17)
at REPLServer.Interface._onLine (readline.js:214:10)
at REPLServer.Interface._line (readline.js:553:8)
at REPLServer.Interface._ttyWrite (readline.js:830:14)
为什么不能JSON.parse
验证参数已经是JSON object
并且在这种情况下什么也不做,而不是抛出错误?
答案 0 :(得分:5)
在JSON.parse
上的ECMA文档中,parse
方法的第一件事就是使用toString()
对第一个参数进行字符串化。您可以在此处查看文档:{{3}}。
换句话说,JSON.parse([])
相当于JSON.parse([].toString())
,相当于JSON.parse("")
。以这种方式看待,错误unexpected end of input
实际上更有意义。在空字符串中无需解析。
更直接地回答您的问题,JSON.parse
需要一些性能开销来推断和序列化本机javascript对象为JSON(JSON不是javascript)。此外,它将违反单一责任原则(SRP)。 JSON.parse
负责解析字符串,而不是对象。
答案 1 :(得分:2)
为什么不将传递的对象用作有效的JSON
如果将对象传递给JSON.parse(obj)
,则会将其转换为字符串:相当于obj.toString()
或'' + obj
。它不会尝试将传递的对象验证为有效的JSON。
为何产生错误
[]
空数组的问题是它转换为空字符串:''
并且这不是有效的JSON。
如果是空字符串,则无法返回null
或undefined
(因为它们具有有效的JSON字符串:JSON.parse('null')
或JSON.parse('undefined')
)并且抛出错误是有用的选项。
检查here确切的JSON格式。
等效工作示例
以下示例工作正常,因为该对象转换为有效的JSON字符串:
JSON.parse({toString: function() {return '{"a": 1}'}}); // prints an object {a: 1}
JSON.parse([1]); // prints a number 1
JSON.parse('""') // prints an empty string ""
答案 2 :(得分:1)
它是JSON.parse
,而不是JSON.tryParse
。如果你真的需要输入一些输入而你不知道它是否被串联,你将需要开发自己的方法来确定。我很高兴它没有做到这一点。它的当前行为很简单,并且如果我做了一些愚蠢的事情就会正确地抛出错误,以便我知道要纠正它。