为什么JSON.parse无法检测参数是否已经是JSON格式

时间:2016-04-19 05:08:06

标签: javascript json

我们知道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并且在这种情况下什么也不做,而不是抛出错误?

3 个答案:

答案 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。
如果是空字符串,则无法返回nullundefined(因为它们具有有效的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。如果你真的需要输入一些输入而你不知道它是否被串联,你将需要开发自己的方法来确定。我很高兴它没有做到这一点。它的当前行为很简单,并且如果我做了一些愚蠢的事情就会正确地抛出错误,以便我知道要纠正它。