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

Mar*_*son 17 serialization json knockout-2.0 knockout.js

使用时:

var dataToSave = ko.toJSON(myViewModel);
Run Code Online (Sandbox Code Playgroud)

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

序列化我当前的viewModel会创建大约500Kb的JSON,其中大部分结果如下:

"SomeObject": {
    "Property1": 12345,
    "Property2": "Sometext",
    "Property3": null,
    "Property4": null,
    "Property5": null,
    "Property6": null,
    "Property7": null,
    "Property8": null,
    "Property9": false
}
Run Code Online (Sandbox Code Playgroud)

如果我可以让序列化程序忽略空值,那么这可以减少到:

"SomeObject": {
    "Property1": 12345,
    "Property2": "Sometext",
    "Property9": false
}
Run Code Online (Sandbox Code Playgroud)

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

del*_*ree 29

请记住,ko.toJSON只是对JSON stringify的修改.您可以传入替换函数.

作为在Knockout中使用替换器函数的一个例子,我基于其中一个淘汰教程组建了一个JSFiddle.注意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;
        }
    }));
};
Run Code Online (Sandbox Code Playgroud)


Mat*_*and 15

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

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

您可以自动执行它以运行所有属性并删除null属性.

  • @MarkRobinson:不是这样,你检查它是否为空,只有删除它才会被删除.我会编辑我的答案以明确这一点. (2认同)