freeCodeCamp/guide/russian/javascript/standard-objects/json/json-stringify/index.md

8.1 KiB
Raw Blame History

title localeTitle
JSON Stringify JSON Stringify

JSON Stringify

Метод JSON.stringify() преобразует JSON-безопасное значение JavaScript в строку, совместимую с JSON.

Что такое JSON-безопасные значения? Давайте составим список всех JSON-небезопасных значений, а все, что отсутствует в списке, можно считать безопасным для JSON.

JSON-небезопасные значения:

  • undefined
  • function(){}
  • (ES6 +) Symbol
  • Объект с круговой ссылкой (-ами) в нем

Синтаксис

  JSON.stringify( value [, replacer [, space]]) 

В своей простейшей и наиболее часто используемой форме:

  JSON.stringify( value ) 

параметры

value : value JavaScript, которое должно быть «stringified».

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

space : (Необязательно) Числовое или строковое значение для предоставления отступов для строки JSON. Если числовое значение предоставлено, то многие пробелы (до 10) действуют как indentaion на каждом уровне. Если задано строковое значение, эта строка (до первых 10 символов) действует как отступ на каждом уровне.

Тип возврата

Тип возвращаемого метода: string .

Описание

Значения JSON-safe преобразуются в соответствующую строковую строку JSON. С другой стороны, JSON-небезопасные значения возвращают:

  • undefined если они переданы как значения для метода
  • null если они переданы как элемент массива
  • ничего, если передать свойства объекта
  • выдает ошибку, если ее объект с круговыми ссылками (ссылками) на нем.
  //JSON-safe values 
  JSON.stringify({});                  // '{}' 
  JSON.stringify(true);                // 'true' 
  JSON.stringify('foo');               // '"foo"' 
  JSON.stringify([1, 'false', false]); // '[1,"false",false]' 
  JSON.stringify({ x: 5 });            // '{"x":5}' 
  JSON.stringify(new Date(2006, 0, 2, 15, 4, 5))  // '"2006-01-02T15:04:05.000Z"' 
 
  //JSON-unsafe values passed as values to the method 
  JSON.stringify( undefined );                    // undefined 
  JSON.stringify( function(){} );                    // undefined 
 
  //JSON-unsafe values passed as array elements 
  JSON.stringify({ x: [10, undefined, function(){}, Symbol('')] });  // '{"x":[10,null,null,null]}' 
 
 //JSON-unsafe values passed as properties on a object 
  JSON.stringify({ x: undefined, y: Object, z: Symbol('') });  // '{}' 
 
  //JSON-unsafe object with circular reference on it 
  var o = { }, 
    a = { 
      b: 42, 
      c: o, 
      d: function(){} 
    }; 
 
  // create a circular reference inside `a` 
  oe = a; 
 
  // would throw an error on the circular reference 
  // JSON.stringify( a ); 

JSON.stringify(...) ведет себя по-другому, если объект, переданный ему, имеет метод toJSON() определенный на нем. Возвращаемое значение из toJSON() будет сериализоваться вместо самого объекта.

Это очень удобно, когда объект содержит какое-либо незаконное значение JSON.

   //JSON-unsafe values passed as properties on a object 
   var obj = { x: undefined, y: Object, z: Symbol('') }; 
 
   //JSON.stringify(obj);  logs '{}' 
   obj.toJSON = function(){ 
    return { 
      x:"undefined", 
      y: "Function", 
      z:"Symbol" 
    } 
   } 
   JSON.stringify(obj);  //"{"x":"undefined","y":"Function","z":"Symbol"}" 
 
  //JSON-unsafe object with circular reference on it 
  var o = { }, 
    a = { 
      b: 42, 
      c: o, 
      d: function(){} 
    }; 
 
  // create a circular reference inside `a` 
  oe = a; 
 
  // would throw an error on the circular reference 
  // JSON.stringify( a ); 
 
  // define a custom JSON value serialization 
  a.toJSON = function() { 
    // only include the `b` property for serialization 
    return { b: this.b }; 
  }; 
 
  JSON.stringify( a ); // "{"b":42}" 

replacer

replacer , как упоминалось ранее, является фильтром, который указывает, какие свойства должны быть включены в строку JSON. Это может быть либо массив, либо функция. Когда массив, replacer содержит строковые представления только тех свойств, которые должны быть включены в строку JSON.

  var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7}; 
  JSON.stringify(foo, ['week', 'month']);    // '{"week":45,"month":7}', only keep "week" and "month" properties 

Если replacer является функцией, он будет вызываться один раз для самого объекта, а затем один раз для каждого свойства в объекте и каждый раз передается два аргумента, ключ и значение . Чтобы пропустить ключ в сериализации, undefined должен быть возвращен. В противном случае возвращаемое значение должно быть возвращено. Если любое из этих значений является самими объектами, функция replacer сериализует их рекурсивно.

  function replacer(key, value) { 
    // Filtering out properties 
    if (typeof value === 'string') { 
      return undefined; 
    } 
    return value; 
  } 
 
  var foo = {foundation: 'Mozilla', model: 'box', week: 45, transport: 'car', month: 7}; 
  JSON.stringify(foo, replacer);  // '{"week":45,"month":7}' 

Если массив передается в JSON.stringify() а replacer возвращает undefined для любого из его элементов, значение элемента заменяется на null . Функции- replacer не могут удалить значения из массива.

  function replacer(key, value) { 
    // Filtering out properties 
    if (typeof value === 'string') { 
      return undefined; 
    } 
    return value; 
  } 
 
  var foo = ['Mozilla', 'box', 45, 'car', 7]; 
  JSON.stringify(foo, replacer);  // "[null,null,45,null,7]" 

space

Параметр space используемый для отступа, делает результат JSON.stringify() более JSON.stringify() .

  var a = { 
    b: 42, 
    c: "42", 
    d: [1,2,3] 
  }; 
 
  JSON.stringify( a, null, 3 ); 
  // "{ 
  //    "b": 42, 
  //    "c": "42", 
  //    "d": [ 
  //       1, 
  //       2, 
  //       3 
  //    ] 
  // }" 
 
  JSON.stringify( a, null, "-----" ); 
  // "{ 
  // -----"b": 42, 
  // -----"c": "42", 
  // -----"d": [ 
  // ----------1, 
  // ----------2, 
  // ----------3 
  // -----] 
  // }" 

Дополнительная информация:

Обратитесь к документам MDN .