JavaScript метод JSON.parse()
Определение и применение
JavaScript метод .parse() объекта
JSON
является статическим методом, предназначенным для анализа (парсинга) строк в формате
JSON, при необходимости преобразует и возвращает значения, полученные в ходе анализа.
В качестве возвращаемого значения вы можете получить объект, массив или элементарное значение, полученное в результате анализа переданной строки в формате JSON.
Для того, чтобы преобразовать элементарные значения, объекты, или массивы в строку в формате JSON вы можете
воспользоваться статическим методом
JSON.stringify()
(сериализует объект, массив или элементарное значение).
JSON требует двойных кавычек для строк и ключей. Комментарии, завершающие запятые и
undefined недопустимы. Числа преобразуются в
Number
и могут потерять точность ещё до вызова reviver (необязательной функции преобразования разобранных
значений); большие целые безопаснее передавать строками либо восстанавливать из context.source (свойства
третьего аргумента функции reviver, содержащего исходный JSON-текст текущего примитивного значения).
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2015 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
parse | 3 | 12 | 3.5 | 10.5 | 4 | 18 | 4 | 11 | 4 | 1.0 | 4.4 | 4 |
| Reviver has context parameter | 114 | 114 | 135 | 100 | 18.4 | 114 | 135 | 76 | 18.4 | 23.0 | 114 | 18.4 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис:
JSON.parse(text);
JSON.parse(text, reviver);Спецификация
ECMAScript — JSON.parse(). Метод стандартизован в ECMAScript 5.
Значения параметров
| Параметр | Описание |
|---|---|
text |
Анализируемая строка в формате JSON. Обязательный параметр. |
reviver |
Функция, предназначенная для преобразования значения, полученного в ходе анализа перед его возвращением из
метода. Необязательный параметр.
Аргументы — ключ (имя свойства или индекс массива в виде строки) и текущее значение. Для примитивов
современные реализации дополнительно передают
Возвращённое значение заменяет текущее. Возврат
У обычной функции |
Исключения
| Тип исключения | Описание |
|---|---|
SyntaxError |
Возникает в том случае, если разбираемая строка содержит не допустимый (не валидный) JSON. |
Примеры, попробуйте сами
Базовый анализ строк в виде JSON
В следующем примере мы с Вами рассмотрим как с помощью статического метода JSON.parse() объекта
JSON
произвести анализ строк в формате JSON и вернуть значения, полученные в ходе анализа.
Из JSON-строки в значение JavaScript
Измените исходные значения или аргументы метода и нажмите . Сравните результат в консоли.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем три переменные, содержащие строки в формате JSON
const jsonString = '{"a":true, "b":10, "c": ["c1", "c2", "c3"], "d":{"d1": 1, "d2": 2, "d3": 3}}',
jsonString2 = '["a", "b", {"c": false}]',
jsonString3 = '"test"'
// анализируем переданные строки и инициализируем переменные, полученным значением
const obj = JSON.parse(jsonString),
obj2 = JSON.parse(jsonString2),
obj3 = JSON.parse(jsonString3)
// выводим в консоль значения переменных
console.log(obj)
// {a: true, b: 10, c: ["c1", "c2", "c3"], d: {d1: 1, d2: 2, d3: 3}}
console.log(obj2)
// ["a", "b", {c: false}]
console.log(obj3)
// "test"
В этом примере мы инициализируем три переменные, которые содержат строки в формате JSON. С помощью
метода JSON.parse() мы анализируем переданные строки и инициализируем переменные, полученным значением.
Для демонстрации работы метода JSON.parse() выводим полученные значения в консоль.
Использование функции для преобразования JSON
В этом примере мы рассмотрим использование второго аргумента метода JSON.parse() - функции,
которая позволяет преобразовать значение, полученное в ходе анализа перед его возвращением из метода:
Как reviver изменяет и удаляет значения
Измените исходные значения или аргументы метода и нажмите . Сравните результат в консоли.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую строку в формате JSON
const jsonString = '{"a": 1,"b": false,"c": "3"}'
// преобразуем значение, полученное в ходе анализа таким образом, что оставляем только те свойства значения которых не являются числами
const obj = JSON.parse(jsonString, (key, val) => (typeof val !== 'number' ? val : undefined))
console.log(obj)
// {b: false, c: "3"}
// преобразуем значение, полученное в ходе анализа таким образом, что оставляем только те свойства значения которых являются числами
const obj2 = JSON.parse(jsonString, (key, val) => (typeof val === 'number' || key === '' ? val : undefined))
console.log(obj2)
// {a: 1}
// преобразуем значение, полученное в ходе анализа таким образом, что изменяем все числовые значения на 777
const obj3 = JSON.parse(jsonString, (key, val) => (typeof val === 'number' ? (val = 777) : val))
console.log(obj3)
// {a: 777, b: false, c: "3"}
// преобразуем значение, полученное в ходе анализа таким образом, что изменяем значение свойства "b" на "deleted"
const obj4 = JSON.parse(jsonString, (key, val) => (key === 'b' ? (val = 'deleted') : val))
console.log(obj4)
// {a: 1, b: "deleted", c: "3"}
// Вложенные значения обрабатываются раньше контейнеров и корня.
JSON.parse('{"items":[1]}', (key, value) => {
console.log(key, value)
return value
})
// Возврат undefined для корня удаляет весь результат.
console.log(JSON.parse('{"a":1}', () => undefined))
// source сохраняет точную запись числа, даже если Number уже округлён.
JSON.parse('{"large":9007199254740993}', (key, value, context) => {
if (key === 'large') console.log(value, context?.source ?? 'context.source не поддерживается')
return value
})
// Удаление элемента не уменьшает длину массива.
const sparse = JSON.parse('[1,2]', (key, value) => (key === '0' ? undefined : value))
console.log(sparse.length, 0 in sparse)
// Невалидный JSON вызывает SyntaxError.
try {
JSON.parse('{"a":1,}')
} catch (error) {
console.log(error.name)
}
В этом примере с использованием функции метода JSON.parse() (второй аргумент), предназначенной для
преобразования значения, полученного в ходе анализа перед его возвращением из метода мы:
- В первом случае оставляем только те свойства значения которых не являются числами.
- Во втором случае оставляем только те свойства значения которых являются числами. Обратите внимание, что последний вызов функции осуществляется с пустым ключом, по этой причине мы добавляем дополнительную проверку. В описании аргумента есть пояснение этому.
- В третьем случае изменяем все числовые значения на 777.
- В четвертом случае изменяем значение свойства "
b" на "deleted".
Глубокое копирование объекта
Глубокое копирование создаёт независимые вложенные объекты. Связка JSON.parse(JSON.stringify(obj)) подходит только для
JSON-совместимых данных: она теряет undefined, функции, символы и прототипы, превращает
Date
в строку, а NaN и бесконечности — в null. Циклические ссылки и BigInt без
специального преобразования вызывают TypeError. Для поддерживаемых типов и циклических ссылок используйте
structuredClone(); функции он также не копирует.
Давайте рассмотрим как с помощью методов JSON.parse() и
JSON.stringify()
сделать глубокую копию нашего объекта:
Изменение оригинала не затрагивает JSON-копию
Измените исходные значения или аргументы метода и нажмите . Сравните результат в консоли.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
// инициализируем переменную, содержащую объект
let obj = {
a: 1,
b: {
c: 2,
},
}
// осуществляем глубокое копирование объекта и инициализируем переменную
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj) // переменная содержит значение { a: 1, b: { c: 2} }
obj.b.c = 200 // изменяем значение свойства объекта obj
console.log(obj) // переменная содержит значение { a: 1, b: { c: 200} }
console.log(newObj) // переменная содержит значение { a: 1, b: { c: 2} }
В этом примере с использованием метода
JSON.stringify()
мы преобразовали значение переменной obj в строку JSON, а с помощью метода
JSON.parse() анализируем эту строку и возвращаем новый объект, соответствующий переданной строке. В
результате чего, свойства, значением которых является объект имеют собственные значения, а не ссылаются на
первоначальный объект. Для показанного JSON-совместимого объекта получается независимая копия вложенных данных.