web-dev-qa-db-ja.com

ko.toJSONを使用したノックアウトシリアル化-nullのプロパティを無視する方法

使用する場合:

var dataToSave = ko.toJSON(myViewModel);

.. nullの値をnotシリアル化することは可能ですか?

現在のviewModelをシリアル化すると、約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
}

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

18
Mark Robinson

ko.toJSONJSON stringify の単なる変更であることに注意してください。 置換関数 を渡すことができます。

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

ToJSONメソッドをビューモデルに追加し、それを使用して不要なプロパティをすべて削除できます。

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

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

15
Matt Burland