Секуляция нокаутом с 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;
 }

Возможно, вы могли бы автоматизировать его, чтобы выполнить все свои свойства и удалить нулевые.