【问题标题】:SyntaxError: Unexpected token o in JSON at position 1 - Simple ErrorSyntaxError:位置 1 处 JSON 中的意外标记 o - 简单错误
【发布时间】:2020-07-15 05:37:24
【问题描述】:

我目前正在学习 node.js 的课程,但收到以下错误消息: SyntaxError: 位置 1 处 JSON 中的意外标记 o

我预计给我这个问题的代码是:

    const loadNotes = function() {
       // try {
            //This code is exactly the same as the video's
            const dataBuffer = fs.readFileSync('notes.json')
            const dataJSON = JSON.toString(dataBuffer) 
            return JSON.parse(dataJSON)
        //} catch(e) {
            //return [] 
       // }

我检查了类似的答案,但它们似乎更复杂,因此,我无法使用它们解决问题。

【问题讨论】:

  • 你为什么打电话给JSON.toString?你期望JSON.toString(dataBuffer) 是什么?你看过哪个“视频”告诉你使用JSON.toString
  • JSON 对象没有该方法。你的意思可能是JSON.stringify()
  • @IvánSánchez 当然,JSON.toString 存在。它总是返回"[object JSON]"

标签: node.js json


【解决方案1】:

您的 JSON.toString() 没有返回您认为的内容。

toString() 正在返回 JSON 对象的字符串表示形式。

结果是:[object JSON]

这不是一个正确的 JSON 字符串,因此 JSON.parse() 失败。

所以,有两个问题:

  1. 您错误地使用了原型toString() method
  2. 您正在向 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 字符串在 keyvalue 周围有 双引号。 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 字符串。

【讨论】:

    【解决方案2】:

    “意外令牌”错误表示您的 JSON 格式不正确。你可以看看this site,把notes.json的内容放进去,它会告诉你哪里错了,哪里需要改正

    【讨论】:

      猜你喜欢
      • 2021-08-28
      • 1970-01-01
      • 2020-02-16
      • 2018-08-08
      • 2016-08-29
      相关资源
      最近更新 更多