为什么 JSON.parse 无法检测参数是否已采用 JSON 格式
Why JSON.parse cant detect if argument is already in JSON format
正如我们所知,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。
在空字符串的情况下,无法返回null
或undefined
(因为它们具有有效的 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
。如果你真的需要传入一些输入,并且你不知道它是否是字符串化的,你将需要开发自己的方法来确定它。我很高兴它没有这样做。它当前的行为很简单,如果我做了一些愚蠢的事情,就会正确抛出错误,以便我知道要纠正它。
- 在HTML页面上将URL解析为可读的json格式
- 为DataTables aoColumnDefs创建JavaScript数组(JSON格式)
- 从Particle Photon Webhook到Azure的JSON格式
- json格式的国家数据到层次数据
- 从javascript调用C#Web服务并使用它(json格式)
- HTML表的JSON格式
- 如何将HTML表单(JSON格式)中的数据分配给变量
- Neo4j结果(JSON格式)创建D3树图
- 高图表数据导入 JSON - 格式
- 更改代码以读取不同的 JSON 格式
- JSON 格式问题
- 将JavaScript字典转换为JSON格式
- 将 XML 数据转换为 json 格式 AngularJS
- KendoDatePicker 无法识别从 Web 服务以 JSON 格式返回的日期
- 在表单提交时设置JSON格式
- AngularJS ng重复json格式
- 如何将json格式的数组数据从jquery返回到html
- 为什么 JSON.parse 无法检测参数是否已采用 JSON 格式
- 如何使用jQuery从表中以JSON格式发布数据
- json格式作为cordova或phonegap ios插件的参数