Разница между 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}