2012-09-17 16 views
15

Uso:Knockout serializzazione con ko.toJSON - come ignorare le proprietà che sono nulli

var dataToSave = ko.toJSON(myViewModel); 

.. E 'possibile non valori serializzare che sono nulli?

serializzazione mio ViewModel corrente crea attorno a 500Kb di JSON la maggior parte dei quali è finisce come:

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

Se ho potuto ottenere il serializzatore di ignorare i valori nulli allora questo potrebbe essere ridotta fino al:

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

Qualche idea su come posso ordinare al serializzatore di ignorare i valori nulli ??

+3

Qualcosa da notare, ko.toJSON ** fa ** ignora i valori di undefined, vedi fiddle per gli esempi. http://jsfiddle.net/Rynan/EnVmu/ – Rynan

+0

@Rynan - Questa è un'osservazione utile. Non me ne sono reso conto, quindi grazie. –

risposta

26

Ricordare che ko.toJSON è solo una modifica di JSON stringify. È possibile passare in un replacer function.

Come esempio di utilizzo di una funzione di sostituzione in Knockout, ho creato uno JSFiddle basato su uno degli knockout tutorials. Notare la differenza tra le funzioni makeJson e makeCleanJson. Possiamo scegliere di non restituire alcun valore nella nostra funzione replacer e l'elemento verrà saltato nella stringa 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

Ottima risposta, deltree. E grazie per il jsFiddle. L'unica modifica che ho fatto è stata quella di usare "value === null" invece di "value == null" solo per essere più sicuro! –

+0

@MarkRobinson felice di aver potuto aiutare – deltree

+0

grazie per questa risposta, proverò presto ... volevo solo farti sapere che il ref di ko nel jsFiddle è morto. Utilizzato questo invece - http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js –

14

È possibile aggiungere un metodo toJSON al vostro modello di vista e l'uso che per rimuovere tutte le proprietà non necessarie:

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

Si potrebbe probabilmente automatizzare a correre attraverso tutte le proprietà ed eliminare quelli nulli .

+0

Grazie per la risposta Matt, ma penso che funzioni di più se la proprietà non dovrebbe MAI essere convertita in JSON piuttosto che nel mio caso in cui voglio solo convertire la proprietà in JSON quando il suo valore non è nullo. –

+2

@MarkRobinson: Non è così, si controlla se è nullo e lo si elimina solo se lo è. Modificherò la mia risposta per chiarire questo punto. –

+1

Grazie per il chiarimento, Matt. L'approccio modificato funzionerebbe. Il vantaggio del tuo approccio sembra essere che offre un controllo a grana fine su cui le proprietà hanno ignorato i valori nulli, ma la risposta @deltree funziona globalmente con solo un paio di righe di codice che si adattano meglio alla mia situazione. +1 comunque per un approccio utile. –

Problemi correlati