您的 JSON.toString() 没有返回您认为的内容。
toString() 正在返回 JSON 对象的字符串表示形式。
结果是:[object JSON]
这不是一个正确的 JSON 字符串,因此 JSON.parse() 失败。
所以,有两个问题:
- 您错误地使用了原型
toString() method
- 您正在向 JSON.parse() 提供非 JSON 字符串
解释:
首先,如上面的 cmets 所述,JSON 对象中没有定义 toString() 方法。 JSON 对象原型链中的 .toString() 在您调用它时确实会执行 something ,但结果是 JavaScript JSON 对象的字符串表示形式,而不是您尝试从文件中读取的 JSON 对象。你真的想使用JSON.stringify() 而不是 toString()。
这是MDN中的解释:
每个对象都有一个 toString() 方法,当
该对象将被表示为一个文本值或当一个对象是
以预期字符串的方式引用。默认情况下,
toString() 方法被从 Object 派生的每个对象继承。
如果此方法未在自定义对象中被覆盖,则 toString()
返回“[object type]”,其中 type 是对象类型。
因此,您可以在 JavaScript 中对任何对象调用 toString() 并获取 [object Object]。但这不是你想要的。所以,不要使用 toString()。它没有做你认为它在做的事情。
其次,请确保您尝试解析 real JSON 字符串,而不是尝试解析 JavaScript 对象。两者有很大区别。
看看这段代码:
let dataJS = {
key: "value"
}
在上面,我定义了一个名为 dataJS 的 JavaScript 对象。
我可以使用 JSON.stringify() 方法将 dataJS JavaScript 对象转换为 JSON 对象,如下所示:
let dataJSON = JSON.stringify(dataJS);
JSON.stringify() 方法需要一个 JavaScript 对象并将返回一个 JSON 字符串。我已将生成的 JSON 字符串分配给 dataJSON。现在,我有两个东西:一个名为 dataJS 的 JavaScript 对象和一个名为 dataJSON 的 JSON 字符串。
我可以这样打印这两件事的内容:
console.log("JSON:\n", dataJSON)
console.log("JS:\n", dataJS)
仔细注意这两者是如何出现的。你会看到这个:
JSON:
{"key":"value"}
JS:
{ key: 'value' }
你看到 JSON 字符串和 JavaScript 对象之间的区别了吗?
JSON 字符串在 key 和 value 周围有 双引号。 JavaScript 对象在 key 周围没有任何引号,在值周围没有单引号。
这些使得 JSON 字符串和 JavaScript 对象完全不同。
因此,如果您不小心将错误的内容提供给 JSON.parse() 方法,您将收到错误消息。请注意当我将 JSON 对象提供给 JSON.parse() 方法时会发生什么:
console.log("Parse JSON:\n", JSON.parse(dataJSON))
/* result will be:
* Parse JSON:
* { key: 'value' }
*/
太好了! JSON.parse() 方法需要一个 JSON 字符串,因此它可以正常工作。
但是看看会发生什么,然后我尝试将 JSON.parse() 提供给我们创建的 JavaScript 对象:
console.log("Parse JS:\n", JSON.parse(dataJS))
/* result will be an ERROR:
* undefined:1
* [object Object]
* ^
*
* SyntaxError: Unexpected token o in JSON at position 1
*/
这是你的错误!
因此,这意味着您在代码中提供 JSON.parse() 方法的内容不是 JSON 字符串。