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

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

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

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

3 ответа

Решение

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

поведение toJSON

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

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

var string = JSON.stringify(m);

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

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

Магистраль по умолчанию 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,

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

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

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

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

    Один пример, JSON.stringify() 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}"
    

Я также читаю приложение Addy Osmani Developing 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}
Другие вопросы по тегам