Ваш JSON .toString () не возвращает то, что вы думаете.
toString () возвращает строковое представление объекта JSON.
Результат : [object JSON]
Это неправильная строка JSON, поэтому JSON .parse () не работает.
Итак, есть две проблемы:
- Вы неправильно используете прототип
toString() method
- Вы вводите строку, отличную от 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 строка.