Spec-Zone.ru › JavaScript

JSON.parse()

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Статический метод JSON.parse() анализирует строку JSON, конструируя значение или объект JavaScript, описанный этой строкой. Может быть предоставлена необязательная функция reviver для выполнения преобразования результирующего объекта до его возврата.

Попробуйте

const json = '{"result":true, "count":42}';
const obj = JSON.parse(json);

console.log(obj.count);
// Expected output: 42

console.log(obj.result);
// Expected output: true

Синтаксис

JSON.parse(text)
JSON.parse(text, reviver)

Параметры

text
Строка для анализа как JSON. Описание синтаксиса JSON см. в объекте JSON.
reviver Необязательно
Если это функция, она определяет, как каждое значение, первоначально полученное в результате парсинга, преобразуется перед возвратом. Невызываемые значения игнорируются. Функция вызывается со следующими аргументами:
key
Ключ, связанный со значением.
value
Значение, полученное в результате парсинга.
context Необязательно
Объект контекста, который хранит состояние, относящееся к текущему восстанавливаемому выражению. Это новый объект для каждого вызова функции reviver. Он передается только при восстановлении примитивных значений, но не тогда, когда value является объектом или массивом. Он содержит следующее свойство:
source
Исходная строка JSON, представляющая это значение.

Возвращаемое значение

Значение Object, Array, строка, число, булево значение или null, соответствующее предоставленной text JSON.

Исключения

SyntaxError
Выдается, если анализируемая строка не является действительным JSON.

Описание

JSON.parse() анализирует строку JSON в соответствии с грамматикой JSON, а затем вычисляет строку, как если бы это было выражение JavaScript. Единственный случай, когда фрагмент текста JSON представляет собой значение, отличное от того же выражения JavaScript, — это работа с ключом "__proto__". См. Синтаксис объектного литерала vs. JSON.

Параметр reviver

Если указан reviver, значение, вычисленное при парсинге, преобразуется перед возвратом. В частности, вычисленное значение и все его свойства (в порядке поиска в глубину, начиная с наиболее вложенных свойств и переходя к самому исходному значению) индивидуально обрабатываются с помощью reviver.

reviver вызывается с объектом, содержащим обрабатываемое свойство, в качестве this (если только вы не определяете reviver как стрелочную функцию, и в этом случае отдельной привязки this не существует) и двумя аргументами: key и value, представляющими имя свойства в виде строки (даже для массивов) и значение свойства. Для примитивных значений передается дополнительный параметр context, который содержит исходный текст этого значения. Если функция reviver возвращает undefined (или не возвращает никакого значения — например, если выполнение выходит за пределы функции), свойство удаляется из объекта. В противном случае свойство переопределяется возвращаемым значением. Если reviver преобразует только некоторые значения, а не другие, обязательно возвращайте все непреобразованные значения как есть — в противном случае они будут удалены из результирующего объекта.

Подобно параметру replacer функции JSON.stringify(), для массивов и объектов reviver будет вызван в последний раз для корневого значения с пустой строкой в качестве key и корневым объектом в качестве value. Для других допустимых значений JSON reviver работает аналогично и вызывается один раз с пустой строкой в качестве key и самим значением в качестве value.

Если вы возвращаете другое значение из reviver, это значение полностью заменит исходное проанализированное значение. Это относится даже к корневому значению. Например:

const transformedObj = JSON.parse('[1,5,{"s":1}]', (key, value) =>
  typeof value === "object" ? undefined : value,
);

console.log(transformedObj); // undefined

Не существует общего способа обойти это. Вы не можете специально обработать случай, когда key является пустой строкой, поскольку объекты JSON также могут содержать ключи, являющиеся пустыми строками. Вы должны очень точно знать, какое преобразование необходимо для каждого ключа при реализации reviver.

Обратите внимание, что reviver запускается после того, как значение проанализировано. Таким образом, например, числа в тексте JSON уже будут преобразованы в числа JavaScript и могут потерять точность в процессе. Один из способов передачи больших чисел без потери точности — сериализовать их как строки и восстановить их в BigInts или другие соответствующие форматы произвольной точности.

Вы также можете использовать свойство context.source для доступа к исходному тексту JSON, представляющему значение, как показано ниже:

const bigJSON = '{"gross_gdp": 12345678901234567890}';
const bigObj = JSON.parse(bigJSON, (key, value, context) => {
  if (key === "gross_gdp") {
    // Ignore the value because it has already lost precision
    return BigInt(context.source);
  }
  return value;
});

Примеры

Использование JSON.parse()

JSON.parse("{}"); // {}
JSON.parse("true"); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse("null"); // null

Использование параметра reviver

JSON.parse(
  '{"p": 5}',
  (key, value) =>
    typeof value === "number"
      ? value * 2 // return value * 2 for numbers
      : value, // return everything else unchanged
);
// { p: 10 }

JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', (key, value) => {
  console.log(key);
  return value;
});
// 1
// 2
// 4
// 6
// 5
// 3
// ""

Использование reviver в сочетании с replacer из JSON.stringify()

Чтобы значение могло совершить полный цикл (то есть десериализоваться в тот же исходный объект), процесс сериализации должен сохранять информацию о типе. Например, вы можете использовать параметр replacer функции JSON.stringify() для этой цели:

// Maps are normally serialized as objects with no properties.
// We can use the replacer to specify the entries to be serialized.
const map = new Map([
  [1, "one"],
  [2, "two"],
  [3, "three"],
]);

const jsonText = JSON.stringify(map, (key, value) =>
  value instanceof Map ? Array.from(value.entries()) : value,
);

console.log(jsonText);
// [[1,"one"],[2,"two"],[3,"three"]]

const map2 = JSON.parse(jsonText, (key, value) =>
  Array.isArray(value) && value.every(Array.isArray) ? new Map(value) : value,
);

console.log(map2);
// Map { 1 => "one", 2 => "two", 3 => "three" }

Поскольку в JSON нет синтаксического пространства для аннотирования метаданных типа, для восстановления значений, которые не являются простыми объектами, необходимо рассмотреть один из следующих вариантов:

  • Сериализовать весь объект в строку и добавить к нему префикс тега типа.
  • «Угадывать» на основе структуры данных (например, массив массивов из двух элементов)
  • Если форма полезной нагрузки фиксирована, то на основе имени свойства (например, все свойства с именем registry содержат объекты Map).

Недопустимый JSON

Когда JSON.parse получает строку, не соответствующую грамматике JSON, он выдает SyntaxError.

Массивы и объекты не могут иметь конечных запятых в JSON:

JSON.parse("[1, 2, 3, 4, ]");
// SyntaxError: Unexpected token ] in JSON at position 13

JSON.parse('{"foo": 1, }');
// SyntaxError: Unexpected token } in JSON at position 12

Строки JSON должны быть ограничены двойными (не одинарными) кавычками:

JSON.parse("{'foo': 1}");
// SyntaxError: Unexpected token ' in JSON at position 1

JSON.parse("'string'");
// SyntaxError: Unexpected token ' in JSON at position 0

Если вы пишете JSON внутри строкового литерала JavaScript, вы должны либо использовать одинарные кавычки для ограничения строкового литерала JavaScript, либо экранировать двойные кавычки, ограничивающие строку JSON:

JSON.parse('{"foo": 1}'); // OK
JSON.parse("{\"foo\": 1}"); // OK

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-json.parse

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
parse
3
12
3.5
10.5
4
18
4
11
4
1.0
4.4
4
1.0.0
1.0
0.10.0
reviver_parameter_context_argument
114
114
135
100
18.4
114
135
76
18.4
23.0
114
18.4
1.1.43
1.33
21.0.0

См. также

  • Полифилл современного поведения JSON.parse (параметр context reviver'а) в core-js
  • JSON.stringify()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API