18

使用时:

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
}

有什么想法可以指示序列化程序忽略空值吗?

4

2 回答 2

33

请记住,ko.toJSON只是JSON stringify的修改。你可以传入一个替换函数

作为在 Knockout 中使用替换函数的示例,我根据其中一个淘汰教程整理了一个JSFiddle。注意和函数之间的区别。我们可以选择在我们的替换函数中不返回任何值,并且该项目将在 JSON 字符串中被跳过。makeJsonmakeCleanJson

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;
        }
    }));
};
于 2012-09-17T14:35:28.847 回答
17

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

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

您可能可以将其自动化以运行所有属性并删除空属性。

于 2012-09-17T14:44:37.670 回答