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

Why JSON.parse cant detect if argument is already in JSON format

本文关键字:JSON 格式 是否 检测 parse 为什么 参数      更新时间:2023-09-26

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

JSON.parse 上的 ECMA 文档中,看起来 parse 方法做的第一件事就是使用 toString() 字符串化第一个参数。您可以在此处查看文档本身:http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.2。

换句话说,JSON.parse([])等价于JSON.parse([].toString()),相当于JSON.parse("")。这样看,错误实际上unexpected end of input更有意义。空字符串中没有要分析的内容。

更直接地回答您的问题,JSON.parse需要一些性能开销才能将本机 JavaScript 对象推断并序列化为 JSON(JSON 不是 JavaScript(。此外,这将违反单一责任原则(SRP(。JSON.parse负责解析字符串,而不是对象。

为什么不使用传递的对象作为有效的JSON
使用如果将一个对象传递给JSON.parse(obj),则将其转换为字符串:等效于obj.toString()'' + obj。它不会尝试将传递的对象验证为有效的 JSON。

生成
错误的原因[]空数组的问题在于它转换为空字符串:'',这不是有效的 JSON。
在空字符串的情况下,无法返回nullundefined(因为它们具有有效的 JSON 字符串:JSON.parse('null')JSON.parse('undefined') (,抛出错误是一个有用的选项。
在此处检查确切的 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 ""

它是JSON.parse,而不是JSON.tryParse。如果你真的需要传入一些输入,并且你不知道它是否是字符串化的,你将需要开发自己的方法来确定它。我很高兴它没有这样做。它当前的行为很简单,如果我做了一些愚蠢的事情,就会正确抛出错误,以便我知道要纠正它。