SyntaxError: неожиданный токен в JSON в позиции 1 - простая ошибка - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время я изучаю курс node.js и получаю следующую ошибку: SyntaxError: Неожиданный токен o в JSON в позиции 1

Код, который, как я предполагаю, вызывает у меня эту проблему:

    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 [] 
       // }

Я проверил похожие ответы, но они казались более сложными, и поэтому я не смог решить проблему с их помощью.

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Ваш JSON .toString () не возвращает то, что вы думаете.

toString () возвращает строковое представление объекта JSON.

Результат : [object JSON]

Это неправильная строка JSON, поэтому JSON .parse () не работает.

Итак, есть две проблемы:

  1. Вы неправильно используете прототип toString() method
  2. Вы вводите строку, отличную от JSON, в JSON .parse ()

Пояснение:

Во-первых, как было сказано в комментариях выше, в объекте JSON нет метода toString(). .toString() в цепочке прототипов JSON объекта делает что-то , когда вы вызываете его, но результатом является строковое представление объекта JavaScript JSON, а не объекта JSON, который вы пытаетесь выполнить читать из вашего файла. Вы действительно хотите использовать JSON.stringify() вместо toString ().

Вот объяснение в MDN :

Каждый объект имеет метод toString (), который автоматически вызывается, когда объект должен быть представлен как текстовое значение или когда к объекту обращаются так, как ожидается строка. По умолчанию метод toString () наследуется каждым объектом, производным от Object. Если этот метод не переопределен в настраиваемом объекте, toString () возвращает «[тип объекта]», где тип - это тип объекта.

Таким образом, вы можете вызвать toString() для любого объекта в JavaScript и получите [object Object]. Но это не то, что вам нужно. Итак, не используйте toString (). Он не делает то, что вы думаете.

Во-вторых, убедитесь, что вы пытаетесь разобрать реальную JSON строку, а не пытаетесь разобрать объект JavaScript . Между ними есть существенная разница.

Взгляните на этот код:

let dataJS = {
  key: "value"
}

Выше я определил объект JavaScript с именем data JS.

Я могу преобразовать объект data JS JavaScript в объект JSON, используя метод JSON .stringify (), например:

let dataJSON = JSON.stringify(dataJS);

Метод JSON .stringify () ожидает объект JavaScript и вернет строку JSON. Я присвоил полученную строку JSON data JSON. Теперь у меня есть две вещи: объект JavaScript с именем JS и строка JSON с именем JSON.

Я могу распечатать содержимое этих двух вещей следующим образом:

console.log("JSON:\n", dataJSON)
console.log("JS:\n", dataJS)

Внимательно обратите внимание на то, как появляются эти двое. Вы увидите это:

JSON:
 {"key":"value"}
JS:
 { key: 'value' }

Вы видите разницу между строкой JSON и объектом JavaScript?

В строке JSON есть double - кавычки вокруг ключа и значения s. Объект JavaScript не имеет кавычек вокруг ключа и одинарных кавычек вокруг значения.

Это делает 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 строка.

0 голосов
/ 14 июля 2020

Ошибка «Неожиданный токен» означает, что ваш JSON неправильно отформатирован. Вы можете взглянуть на этот сайт и поместить в него содержимое заметок. json, и он расскажет вам, что не так и что нужно исправить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...