使用ko.toJSON进行Knockout序列化 - 如何忽略null的属性

时间:2012-09-17 14:07:24

标签: json serialization knockout.js knockout-2.0

使用时:

var dataToSave = ko.toJSON(myViewModel);

..是否可以序列化为空的值?

序列化我当前的viewModel会创建大约500Kb的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
}

如何指示序列化程序忽略空值?

2 个答案:

答案 0 :(得分:29)

请记住,ko.toJSON只是对JSON stringify的修改。您可以传递replacer function

作为在Knockout中使用替换器函数的示例,我基于JSFiddle之一组合了knockout tutorials。请注意makeJsonmakeCleanJson函数之间的区别。我们可以选择不在我们的replacer函数中返回任何值,并且将在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;
        }
    }));
};

答案 1 :(得分:15)

您可以将toJSON方法添加到视图模型中,并使用它来删除所有不需要的属性:

 ViewModel.prototype.toJSON = function() {
     var copy = ko.toJS(this);
     // remove any unneeded properties
     if (copy.unneedProperty == null) {
         delete copy.unneedProperty;
     }
     return copy;
 }

您可以自动运行它来运行所有属性并删除空属性。