Секуляция нокаутом с ko.toJSON - как игнорировать свойства, которые являются нулевыми
При использовании:
var dataToSave = ko.toJSON(myViewModel);
.. возможно ли не сериализовать значения, которые являются нулевыми?
Сериализация моего текущего видаModel создает около 500 КБ JSON, большинство из которых заканчивается так:
"SomeObject": {
"Property1": 12345,
"Property2": "Sometext",
"Property3": null,
"Property4": null,
"Property5": null,
"Property6": null,
"Property7": null,
"Property8": null,
"Property9": false
}
Если бы я мог заставить сериализатор игнорировать нулевые значения, это можно было бы уменьшить до:
"SomeObject": {
"Property1": 12345,
"Property2": "Sometext",
"Property9": false
}
Любые идеи о том, как я могу инструктировать сериализатор игнорировать нулевые значения
Ответы
Ответ 1
Помните, что ko.toJSON - это просто модификация JSON stringify. Вы можете передать функцию замены.
В качестве примера использования функции replacer в Knockout я собрал JSFiddle на основе одного из учебники для нокаутов. Обратите внимание на разницу между функциями makeJson
и makeCleanJson
. Мы можем не возвращать какие-либо значения в нашей функции замены, и элемент будет пропущен в строке JSON.
self.makeJson = function() {
self.JsonInfo(ko.toJSON(self.availableMeals));
};
self.makeCleanJson = function() {
self.JsonInfo(ko.toJSON(self.availableMeals, function(key, value) {
if (value == null)
{
return;
}
else
{
return value;
}
}));
};
Ответ 2
Вы можете добавить метод toJSON к вашей модели представления и использовать его для удаления всех ненужных свойств:
ViewModel.prototype.toJSON = function() {
var copy = ko.toJS(this);
// remove any unneeded properties
if (copy.unneedProperty == null) {
delete copy.unneedProperty;
}
return copy;
}
Возможно, вы могли бы автоматизировать его, чтобы выполнить все свои свойства и удалить нулевые.