Подтвердить что ты не робот

Разница между jSON() и JSON.Stringify()

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

http://addyosmani.github.io/backbone-fundamentals/#backbone-basics

Может ли кто-нибудь сказать мне разницу между обоими способами representing an object в нотации JSON. Я просто смущен, добиваются ли они того же или есть разница.

4b9b3361

Ответ 1

Из прекрасного руководства:

toJSON поведение

Если стробируемый объект имеет свойство с именем toJSON, значение которого является функцией, то метод toJSON настраивает поведение строкой JSON: вместо сериализуемого объекта значение, возвращаемое методом toJSON при вызове будет сериализоваться.

Вот почему Backbone использует метод toJSON для сериализации и задан экземпляр модели с именем m, вы можете сказать такие вещи, как:

var string = JSON.stringify(m);

и получить только атрибуты из m, а не кучу шума, который не беспокоит ваш сервер.

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

defaultbain toJSON - это просто (для моделей):

return _.clone(this.attributes);

поэтому m.toJSON() дает вам мелкую копию атрибутов модели. Если в качестве атрибутов есть массивы или объекты, вы прекратите неожиданный обмен ссылками. Обратите внимание, что Backbone.Model#clone также страдает от этой проблемы.

Если вы хотите безопасно клонировать данные модели, вы можете отправить ее через JSON.stringify, а затем JSON.parse, чтобы получить глубокую копию:

var data         = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);

где model_instance - ваш экземпляр модели Backbone m.

Ответ 2

  • JSON.stringify() - Любое допустимое значение представления JSON может быть сжато.

    Утилита JSON.stringify(..) автоматически опускает значения undefined, function и symbol, когда она встречается с ними. Если такое значение найдено в array, это значение заменяется на null (так что информация о расположении массива не изменяется). Если он найден как свойство object, это свойство будет просто исключено.

    Строка JSON имеет особое поведение, которое, если значение object имеет метод toJSON(), этот метод будет вызываться первым, чтобы получить значение, которое будет использоваться для сериализации.

  • toJSON() - к допустимому значению JSON, подходящему для строкования.

    В одном примере JSON.stringify() a object с круговой ссылкой в ​​нем будет выведена ошибка. toJSON() может исправить это следующим образом.

    var o = { };
    var a = {
        b: 32,
        c: o
    };
    
    // circular reference
    o.d = a;
    
    // JSON.stringify( a ); // an error caused by circular reference
    
    // define toJSON method
    a.toJSON = function() {
         return { b: this.b };
    };
    
    JSON.stringify( a ); // "{"b":32}"
    

Ответ 3

Я также читаю Addy Osmani Разработка приложения backbone.js, и у меня есть тот же вопрос. Я понял, попробовав свой пример (список дел) в консоли.

var Todo = Backbone.Model.extend({
    defaults:{
         title:"",
         completed:false
}
});

var todo1 = new Todo(); 


console.log(todo1.toJSON())
//The console shows
//Object {title: "finish your assignment", completed: false}

console.log(JSON.stringify(todo1))
//The console shows
//{"title":"finish your assignment","completed":false}