2012-07-04 40 views
33

Estoy tratando de serializar algunos objetos heredados que "crea perezoso" varias listas. No puedo cambiar el comportamiento heredado.¿Puede Newtonsoft Json.NET omitir la serialización de listas vacías?

he hervido abajo a este sencillo ejemplo:

public class Junk 
{ 
    protected int _id; 

    [JsonProperty(PropertyName = "Identity")] 
    public int ID 
    { 
     get 
     { 
      return _id; 
     } 

     set 
     { 
      _id = value; 
     } 
    } 

    protected List<int> _numbers; 
    public List<int> Numbers 
    { 
     get 
     { 
      if(null == _numbers) 
      { 
       _numbers = new List<int>(); 
      } 

      return _numbers; 
     } 

     set 
     { 
      _numbers = value; 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Junk j = new Junk() { ID = 123 }; 

     string newtonSoftJson = JsonConvert.SerializeObject(j, Newtonsoft.Json.Formatting.Indented); 

     Console.WriteLine(newtonSoftJson); 

    } 
} 

Los resultados actuales son: { "Identidad": 123, "Números": [] }

lo haría como para obtener: { "identidad": 123}

Eso es, me gustaría saltarse ninguna lista, collec ciones, matrices o cosas que están vacías.

Respuesta

49

En caso de que no haya encontrado una solución para esto, the answer es notablemente simple cuando logra rastrearlo.

Si se le permite extender la clase original, agregue una función ShouldSerializePropertyName. Esto debería devolver un booleano que indique si esa propiedad debe ser serializada para la instancia actual de la clase. En el ejemplo, esto podría tener este aspecto (no probado, pero debe obtener la imagen):

public bool ShouldSerializeNumbers() 
{ 
    return _numbers.Count > 0; 
} 

Este enfoque funciona para mí (aunque en VB.NET). Si no puede modificar la clase original, el método IContractResolver descrito en la página vinculada es el camino a seguir.

+12

Puede simplificar esto para 'return (_numbers.Count> 0);' –

+2

¡Me gusta! Buena esa. –

+3

¿puedo hacerlo de una manera genérica? No conozco todos los nombres de las propiedades pero quiero que todas las matrices vacías sean nulas. – Rohit

1

sólo para estar commonorgarden pendantic, Estructuré el caso de prueba sea:

public bool ShouldSerializecommunicationmethods() 
{ 
    if (communicationmethods != null && communicationmethods.communicationmethod != null && communicationmethods.communicationmethod.Count > 0) 
     return true; 
    else 
     return false; 
} 

Como una lista vacía a menudo será nula también. Gracias, por publicar la solución. ATB.

+3

Otra opción que tiene es hacer uso del atributo "NullValueHandling": [JsonProperty ("yourPropertyName", NullValueHandling = NullValueHandling.Ignore)]. Eso debería ayudar a reducir la necesidad de las comprobaciones nulas que refinarán sus controles si es un poco. Solo pensé en mencionarlo ya que puede ser útil. –

+0

En el método ShouldSerialize, aún debe verificar los nulos, de lo contrario, una llamada a ShouldSerialize generará una excepción en los nulos. Incluso si el serializador está codificado para ignorar las excepciones al verificar los métodos de ShouldSerialize, la excepción que se está planteando añadirá una sobrecarga innecesaria que podría afectar el rendimiento. Por lo tanto, puede ganar mucho más de lo que pierde comprobando primero si es nulo. –

Cuestiones relacionadas