2012-09-17 32 views
15

使用:淘汰賽系列化 - 如何忽略那些空的屬性,

var dataToSave = ko.toJSON(myViewModel); 

..是有可能是空連載值?

序列化我目前的視圖模型創建圍繞JSON的500KB其中大部分是像結束:

"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 
} 

任何想法如何我可以指示串行器忽略空值?

+3

需要注意的是,ko.toJSON **會忽略未定義的值,請參閱小提琴示例。 http://jsfiddle.net/Rynan/EnVmu/ – Rynan

+0

@Ranan - 這是一個有用的觀察。我沒有意識到,所以謝謝。 –

回答

26

請記住ko.toJSON只是JSON stringify的修改。您可以通過replacer function

作爲在Knockout中使用替換函數的一個示例,我將基於knockout tutorials之一的JSFiddle放在一起。請注意0​​和makeCleanJson函數之間的差異。我們可以選擇不在replacecer函數中返回任何值,並且該項目將在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

很好的答案,deltree。感謝jsFiddle。我做出的唯一改變是使用'value === null'而不是'value == null',只是爲了更加確定! –

+0

@MarkRobinson很高興我能幫到 – deltree

+0

謝謝你的回答,很快就會試用它......只是想讓你知道jsFiddle中的ko的參考已經死了。用它代替 - http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js –

14

您可以添加的toJSON方法到您的視圖模型,並用它來清除所有不需要的屬性:

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

你也許可以自動執行它通過所有的屬性運行,並刪除空者。

+0

感謝您的答案馬特,但我認爲這工作更多,如果該屬性永遠不會被轉換爲JSON,而不是在我的情況下,我只想將其屬性轉換爲JSON時,其值不爲空。 –

+2

@MarkRobinson:並非如此,你檢查它是否爲空,並且只有在它被刪除時纔會被刪除。我會編輯我的答案以清楚地說明。 –

+1

謝謝你的澄清,馬特。修改後的方法將起作用。你的方法的好處似乎是它提供了更好的紋理控制,哪些屬性的空值被忽略,但@deltree答案在全局工作,只需幾行代碼就能更好地適應我的情況。 +1無論如何一個有用的方法。 –