18

使用時:

var dataToSave = ko.toJSON(myViewModel);

.. null の値をシリアル化しないことは可能ですか?

現在のビューモデルをシリアライズすると、約 500Kb の JSON が作成され、そのほとんどは次のようになります。

"SomeObject": {
    "Property1": 12345,
    "Property2": "Sometext",
    "Property3": null,
    "Property4": null,
    "Property5": null,
    "Property6": null,
    "Property7": null,
    "Property8": null,
    "Property9": false
}

シリアライザーに null 値を無視させることができれば、これは次のように減らすことができます。

"SomeObject": {
    "Property1": 12345,
    "Property2": "Sometext",
    "Property9": false
}

ヌル値を無視するようにシリアライザーに指示する方法はありますか??

4

2 に答える 2

33

ko.toJSONは、JSON stringify を変更しただけであることに注意してください。置換関数を渡すことができます。

Knockout で置換関数を使用する例として、 knockout チュートリアルの 1 つに基づいて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;
 }

おそらく、すべてのプロパティを実行して null のものを削除するように自動化できます。

于 2012-09-17T14:44:37.670 に答える