Книга: JavaScript. Подробное руководство, 6-е издание

JSON

JSON

JSON (ECMAScript 5)

выполняет преобразование в формат JSON и обратно

Описание

JSON - это простой объект, который играет роль пространства имен для глобальных функций JSON.parse() и JSON.stringify(), определяемых стандартом ECMAScript 5. Свойство JSON не является конструктором. Ранее, до появления стандарта ECMAScript 5, совместимые функции преобразования в формат JSON и обратно были доступны в библиотеке http://json.org/json2.js.

Аббревиатура «JSON» происходит от JavaScript Object Notation (форма записи JavaScript-объектов). JSON - это формат сериализации данных, основанный на синтаксисе литералов в языке JavaScript, который может представлять значение null, логические значения true и false, вещественные числа (с использованием формы записи чиcловых литералов в языке JavaScript), строки (с использованием формы записи строковых литералов), массивы значений (с использованием формы записи литералов массивов) и отображения строк в значения (с использованием формы записи литералов объектов). Элементарное значение undefined, а также числовые значения NaN и Infinity не могут быть представлены в формате JSON. Функции, объекты Date, RegExp и Error также не поддерживаются.

Пример

// Создает полную копию любого объект или массива, который может быть
// представлен в формате JSON
function deepcopy(o) { return JSON.parse(JSON.stringify(o)); }

См. также

JSON.parse(), JSON.stringify(), раздел 6.9, http://json.org

JSON.parse()  (ECMAScript 5)

выполняет анализ строки в формате JSON

Синтаксис

JSON.parse(s)
JSON.parse(s, reviver)

Аргументы

s Анализируемая строка.

reviver Необязательная функция, способная преобразовывать значения, полученные в ходе анализа.

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

Объект, массив или элементарное значение, полученное в результате анализа строки s (и, возможно, измененное функцией reviver).

Описание

JSON.parse() - глобальная функция, предназначенная для анализа строк в формате JSON. Обычно ей передается единственный строковый аргумент, и она возвращает значение, представленное строкой.

Необязательный аргумент reviver можно использовать для фильтрации или заключительной обработки значения перед тем, как оно будет возвращено вызывающей программе. Если этот аргумент указан, функция reviver будет вызвана для каждого элементарного значения (но не для объектов или массивов, содержащих эти элементарные значения), полученного в ходе анализа строки s. При вызове функции reviver будет передано два аргумента. Первый - имя свойства, т. е. имя свойства объекта или индекс массива в виде строки. Второй - элементарное значение этого свойства объекта или элемента массива. Кроме того, функция reviver будет вызываться как метод объекта или массива, содержащего элементарное значение. Особый случай, когда строка s является представлением элементарного значения, а не объекта или массива. В этом случае элементарное значение будет сохранено во вновь созданном объекте в свойстве, именем которого является пустая строка, и функция reviver будет вызвана для относительно этого вновь созданного объекта с пустой строкой в первом аргументе и элементарным значением - во втором.

Возвращаемое значение функции reviver станет новым значением заданного свойства. Если функция reviver вернет значение своего второго аргумента, то значение свойства не изменится. Если функция reviver вернет значение undefined (или вообще не вернет никакого значения), то данное свойство будет удалено из объекта или массива перед тем, как JSON.parse() вернет его вызывающей программе.

Пример

Во многих случаях использование JSON.parse() выглядит достаточно просто:

var data = JSON.parse(text);

Функция JSON.stringify() преобразует объекты Date в строки, а вы с помощью собственной функции reviver можете выполнять обратное преобразование. Пример ниже также фильтрует свойства по их именам и возвращает undefined, чтобы удалить определенные свойства из полученного объекта:

var data JSON.parse(text, function(name, value) {
  // Удалить свойства, имена которых начинаются с символа подчеркивания
  if (name[0] == '_') return undefined;
  // Если значение является строкой в формате представления дат ISO 8601,
  // преобразовать его в объект Date,
  if (typeof value === "string" &&
         /Adddd-dd-ddTdd :dd: dd. dddZ$/.test(value))
    return new Date(value);
  // Иначе вернуть неизмененное значение
  return value
});

См. также

JSON.stringify(), раздел 6.9

JSON.stringify() (ECMAScript 5)

сериализует объект, массив или элементарное значение

Синтаксис

JSON.stringify(o)
JSON.stringify(o, filter)
JSON.stringify(o, filter, indent)

Arguments

о Объект, массив или элементарное значение, которое требуется преобразовать в строку в формате JSON.

filter Необязательная функция, которая может изменять значения перед сериализацией, или массив имен свойств, подлежащих сериализации.

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

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

Cстрока в формате JSON представляющая значение о после применения фильтра filter и отформатированная с применением indent.

Описание

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

Когда функция JSON.stringifу() вызывается с единственным аргументом и когда в нем передается объект, массив, строка, число, логическое значение или значение null, сериализация выполняется очень просто. Однако, когда значение для сериализации содержит объекты, являющиеся экземплярами класса, процесс сериализаци усложняется. Если функция JSON.stringify() встретит объект (или массив) с методом toJSON(), она вызовет этот метод и выполнит сериализацию полученного в результате значения, а не самого объекта. Она вызывает метод toJS0N() с единственным строковым аргументом, в котором передается имя свойства объекта или индекс массива. Класс Date определяет метод toJSON(), преобразующий объекты Date в строки с помощью метода Date.toISOString(). Никакие другие классы, встроенные в язык JavaScript, не определяют метод toJSON(), но вы можете определить его в своих классах. Помните, что несмотря на свое имя, метод toJSON() не выполняет сериализацию объекта: он просто возвращает значение, которое будет подвергнуто сериализации вместо оригинального объекта. Второй аргумент функции JSON.stringify() позволяет добавить в процесс сериализаци второй слой фильтрации. Этот необязательный аргумент может быть функцией или массивом и предоставляет возможность реализации двух разных способов фильтрации. Если передать во втором аргументе функцию, она будет использоваться как инструмент замены, подобно методу toJSON(), описанному выше. Эта функция будет вызываться для каждого значения, подлежащего сериализации. Ключевое слово this внутри этой функции замены будет ссылаться на объект или массив, в котором определено текущее значение. Первым аргументом функции замены будет передаваться имя свойства объекта или индекс в массиве для текущего значения, а во втором - само значение. Это значение будет замещено возвращаемым значением функции. Если функция вернет undefined или вообще ничего не вернет, то это значение (и соответствующее ему свойство объекта или элемент массива) будет исключено из сериализации.

Если во втором аргументе передать массив строк (или чисел - они будут преобразованы в строки), эти строки будут использоваться как имена свойств объекта. Любое свойство, имя которого отсутствует в массиве, будет исключено из сериализации. Кроме того, возвращаемая строка будет содержать свойства в том же порядке, в каком они перечислены в массиве.

Функция JSON.stringify() обычно возвращает строку без дополнительных пробелов и символов перевода строки. Если желательно сделать результат более удобочитаемым, можно передать третий агумент. Если указать в нем число от 1 до 10, функция JSON.stringify() вставит символы перевода строки и будет использовать указанное число пробелов для оформления отступов на каждом «уровне» вложенности. Если в этом аргументе передать непустую строку, функция JSON.stringify() вставит символы перевода строки и будет использовать указанную строку (но не более 10 первых символов из нее) для оформления отступов.

Примеры

// Простая сериализация
var text = JSON.stringify(data);
// Указать точно, какие поля подлежат сериализации
var text = JSON.stringify(address, ["city”,"state","country"]);
// Указать функцию замены, чтобы можно было сериализовать объекты RegExp
var text = JSON.stringify(patterns, function(key, value) {
  if (value.constructor === RegExp) return value.toString();
  return value;
});
// Того же эффекта можно добиться иначе:
RegExp.prototype.toJSON = function() { return this.toString(); }

См. также

JSON.parse(), раздел 6.9

Оглавление книги


Генерация: 0.507. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз