Методы JavaScript JSON, toJSON

JavaScript Object Notation (JSON) - это заметный формат для представления объектов и значений. Изначально этот формат был создан для JavaScript, но несколько языков также включают библиотеки для его обработки. Следовательно, использование JSON для обмена данными проще в случае, если клиент использует JavaScript, а сервер написан на PHP, Ruby, Java и т. д.

В целом, JavaScript предлагает два метода преобразования: JSON.stringify и JSON.parse. Первый можно использовать для преобразования объектов в JSON, а второй - для преобразования JSON обратно в объект.

JSON.stringify

Рассмотрим следующий пример использования JSON.stringify:

JSON stringify in javascript
let site = { name: 'W3Docs', hasAdmin: true, books: ['html', 'css', 'js', 'git'], booksCount: 4, }; let json = JSON.stringify(site); console.log(typeof json); // we've got a string! console.log(json); /* JSON-encoded object: { "name": "W3Docs", "hasAdmin": true, "books": ["html", "css", "js", "git"], "booksCount": 4 } */

Пожалуйста, учтите, что JSON-закодированный объект отличается от литерала объекта. Главные различия следующие:

  1. Строка использует двойные кавычки. В JSON не должно быть одиночных кавычек или обратных кавычек. Например, 'W3Docs' становится "W3Docs".
  2. Двойные кавычки следует использовать также для имен свойств объекта. Это обязательно. Например, booksCount : 4 станет "booksCount": 4.

Вы можете применить метод JSON.stringify также к примитивам. Он поддерживает следующие типы данных:

Вот пример:

JSON stringify in javascript
// a JSON number is an ordinary number console.log(JSON.stringify(10)) // 10 // a JSON string is a double-quoted string console.log(JSON.stringify([1, 2, 3])); // [1,2,3] console.log(JSON.stringify(false)); // false console.log(JSON.stringify('W3Docs')) // "W3Docs"

Обратите внимание, что JSON.stringify пропускает некоторые объекты, специфичные для JavaScript, такие как функциональные свойства (методы), символьные свойства и свойства, хранящие undefined.

Давайте рассмотрим следующий случай:

JSON stringify in javascript
let site = { welcome() { // ignore console.log("Welcome"); }, [Symbol("id")]: 10, // ignore someProperty: undefined // ignore }; console.log(JSON.stringify(site)); // {} - empty object

Самое лучшее в этом - то, что вложенные объекты автоматически поддерживаются и преобразуются.

Например:

JSON stringify with nested objects javascript
let site = { name: "W3Docs", books: { booksCount: 4, booksTitle: ["html", "css", "js", "git"] } }; console.log(JSON.stringify(site)); /* The whole structure is stringified: { "name":"W3Docs", "book":{"booksCount":4,"booksTitle":["html","css", "js", "git"]}, } */

Но есть и существенное ограничение: вы не должны использовать циклические ссылки.

Например:

Javascript json stringify objects not use circular references
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: ["html", "css", "js", "git"] }; site.tutorial = books; // site references books books.canUse = site; // books references site console.log(JSON.stringify(site)); // Error: Converting circular structure to JSON

Исключение и Преобразование: replacer

Для JSON.stringify используется следующий полный синтаксис:

let json = JSON.stringify(value[, replacer, space])

У него три аргумента:

  • значение: значение для кодирования;
  • replacer: массив свойств для кодирования или функция отображения функция(key, value);;
  • пробел: количество пробелов, используемых для форматирования.

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

Давайте посмотрим на пример:

JSON stringify in javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // tutorial references books }; books.canUse = site; // books references site console.log(JSON.stringify(site, ['name', 'booksTitle'])); // {"name":"W3Docs","booksTitle":[{},{},{},{}]}
JSON stringify javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // site references books }; books.canUse = site; //books references site console.log(JSON.stringify(site, ['name', 'booksTitle', 'tutorial', 'title', 'booksCount'])); /* { "name":"W3Docs", "booksTitle":[{"title":"html"},{"title":"css"}, {"title":"js"}, {"title":"git"}], "tutorial":{"booksCount":4} } */

Теперь давайте попробуем добавить в список все свойства, за исключением books.free:

Как вы видите, все сериализуется, кроме canUse. Также заметно, что приведенный список выглядит довольно длинным. К счастью, может быть вызвана функция replacer. Вы можете вызвать ее для каждой пары key, value, и может быть возвращено “замененное” значение. Вы можете использовать его вместо исходного значения. Для игнорирования canUse в приведенном ниже примере возвращается undefined:

JSON stringify in javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", booksTitle: [{ title: "html" }, { title: "css" }, { title: "js" }, { title: "git" }], tutorial: books // site references books }; books.canUse = site; // books references site console.log(JSON.stringify(site, function replacer(key, value) { console.log(`${key}: ${value}`); return (key == 'canUse') ? undefined : value; })); /* key:value pairs that come to replacer: : [object Object] name: W3Docs booksTitle: [object Object],[object Object],[object Object],[object Object] 0: [object Object] title: html 1: [object Object] title: css 2: [object Object] title: js 3: [object Object] title: git tutorial: [object Object] booksCount: 4 */

Учтите, что функция replacer получает любую пару ключ / значение вместе с элементами массива и вложенными объектами.

Форматирование:пробел

Как уже упоминалось, у JSON.stringify есть три аргумента. Третий - количество пробелов, используемых для форматирования. Обычно разработчики используют аргумент space для достижения отличного вывода.

space = 2 приказывает JavaScript отображать вложенные объекты на разных строках с отступом в два пробела внутри объекта.

Например:

JSON stringify javascript
let user = { name: "Maria", age: 23, roles: { isAdmin: true, isContentWriter: false } }; console.log(JSON.stringify(user, null, 2)); /* two-space indents: { "name": "Maria", "age": 23, "roles": { "isAdmin": true, "isContentWriter": false } } */ /* for JSON.stringify(user, null, 2) the result would be more indented: { name: "Maria", age: 23, roles: { isAdmin: true, isContentWriter: false } }; */

Пользовательский “ toJSON ”

Как правило, объект может предоставить метод toJSON для реализации преобразования to-JSON. Если он доступен, JSON.stringify автоматически вызывает его.

Вот пример:

JSON stringify javascript
let books = { booksCount: 4 }; let site = { name: "W3Docs", update: new Date(Date.UTC(2020, 1, 2)), books }; console.log(JSON.stringify(site)); /* { "name":"W3Docs", "update":"2020-02-02T00:00:00.000Z", // (1) "books": {"booksCount":4 } // (2) } */

В приведенном выше случае update (1) преобразуется в строку. Причина в том, что все даты имеют встроенный метод toJSON.

Если вы добавите пользовательский toJSON для объекта books (2), он будет выглядеть следующим образом:

toJSON in javascript
let books = { booksCount: 4, toJSON() { return this.booksCount; } }; let site = { name: "W3Docs", books }; console.log(JSON.stringify(books)); // 4 console.log(JSON.stringify(site)); /* { "name":"W3Docs", "books": 4 } */

JSON.parse

Для декодирования JSON-строки используется другой метод, называемый JSON.parse со следующим синтаксисом:

let value = JSON.parse(str, [reviver]);

JSON довольно сложен: объекты и массивы могут включать другие объекты и массивы. Но обязательно следует формату JSON.

Ниже вы можете найти типичные ошибки в рукописном JSON:

let json = `{
  welcome: "Welcome",                     // mistake: property name without quotes
  "site": 'W3Docs',               // mistake: single quotes in value (must be double)
  'hasAdmin': true                  // mistake: single quotes in key (must be double)
  "update": new Date(2000, 2, 3), // mistake: no "new" is allowed, only bare values
  "books": [1, 2, 3, 4]              // here all fine
}`;

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

Резюме

JSON представляет формат данных со стандартом, независимым от библиотек для большинства языков программирования. Он поддерживает массивы, строки, объекты, булевы значения, числа и null.

JavaScript имеет методы JSON.stringify для сериализации в JSON и JSON.parse для чтения из JSON. Если у объекта есть toJSON, вам нужно вызвать его с помощью JSON.stringify..

Время Викторины: Проверьте Свои Навыки!

отовы проверить свои знания? Погрузитесь в наши интерактивные викторины для более глубокого понимания и веселого способа закрепить знания.

Считаете ли это полезным?