2012-09-17 24 views
15

cuando se utiliza:Knockout con ko.toJSON - cómo ignorar las propiedades que son nulas

var dataToSave = ko.toJSON(myViewModel); 

.. es posible no valores serializar que son nulas?

números de serie a mi modelo de vista corriente crea alrededor de 500 Kb de JSON mayoría de los cuales se termina como:

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

Si pudiera conseguir el serializador de ignorar los valores nulos, entonces esto podría ser reducida a:

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

¿Alguna idea de cómo puedo ordenar al serializador que ignore los valores nulos?

+3

Algo a tener en cuenta, ko.toJSON ** does ** ignora los valores de undefined, ve el fiddle para ejemplos. http://jsfiddle.net/Rynan/EnVmu/ – Rynan

+0

@Rynan - Esa es una observación útil. No me di cuenta de eso, gracias. –

Respuesta

26

Recuerde que ko.toJSON es solo una modificación de JSON stringify. Puede pasar un replacer function.

Como un ejemplo del uso de una función de reemplazo en Knockout, armé un JSFiddle basado en uno de los knockout tutorials. Observe la diferencia entre las funciones makeJson y makeCleanJson. Podemos elegir no devolver ningún valor en nuestra función de reemplazo y el elemento se omitirá en la cadena 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

Gran respuesta, deltree. Y gracias por el jsFiddle. ¡El único cambio que hice fue usar 'value === null' en lugar de 'value == null' para estar más seguro! –

+0

@MarkRobinson me alegro de haber podido ayudar – deltree

+0

gracias por esta respuesta, lo intentaré pronto ... solo quería que sepas que la referencia a ko en el jsFiddle está muerta. Usé esto en su lugar - http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js –

14

Puede agregar un método toJSON a su modelo de vista y usarlo para eliminar todas las propiedades que no sean necesarios:

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

Probablemente se podría automatizar para que se ejecute a través de todas sus propiedades y eliminar los nulos .

+0

Gracias por la respuesta de Matt, pero creo que esto funciona más si la propiedad NUNCA se debe convertir a JSON en lugar de en mi caso donde solo quiero convertir la propiedad a JSON cuando su valor no es nulo. –

+2

@MarkRobinson: No es así, comprueba si es nulo y solo lo elimina si es así. Editaré mi respuesta para dejar esto en claro. –

+1

Gracias por la aclaración, Matt. El enfoque modificado funcionaría. La ventaja de su enfoque parece ser que ofrece un control de grano más fino sobre las propiedades que tienen sus valores nulos ignorados, pero la respuesta @deltree funciona globalmente con solo un par de líneas de código que se adaptan mejor a mi situación. +1 de todos modos para un enfoque útil. –

Cuestiones relacionadas