2012-03-22 24 views
54

Tengo algunos datos que tengo que serializar a JSON. Estoy usando JSON.NET. Mi estructura del código es similar a esto:Ignorando campos nulos en Json.net

public struct structA 
{ 
    public string Field1; 
    public structB Field2; 
    public structB Field3; 
} 

public struct structB 
{ 
    public string Subfield1; 
    public string Subfield2; 
} 

El problema es que mi salida JSON sólo necesita tener Field1Field2 O O Field3 - que depende de la cual se utiliza el campo (es decir, no nula). Por defecto, mi JSON se parece a esto:

{ 
    "Field1": null, 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
    "Field3": {"Subfield1": null, "Subfield2": null}, 
} 

Sé que puedo utilizar NullValueHandling.Ignore, pero eso me da JSON que tiene este aspecto:

{ 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
    "Field3": {} 
} 

Y lo que necesito es la siguiente:

{ 
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"}, 
} 

¿Hay una forma simple de lograr esto?

+0

Posible duplicado de [Cómo ignorar una propiedad en la clase si es nulo, usando json.net] (http://stackoverflow.com/questions/6507889/how-to-ignore-a-property-in-class-if -null-using-json-net) –

Respuesta

58

Sí, necesita usar JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

Pero debido structs are value types que necesita para marcar Campo2, Campo3 anulable para obtener el resultado esperado:

public struct structA 
{ 
    public string Field1; 
    public structB? Field2; 
    public structB? Field3; 
} 

o simplemente utilizar las clases en lugar de estructuras.

Documentación: NullValueHandling Enumeration

+1

para obtener más información, consulte http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size. aspx –

54

También puede aplicar el atributo JsonProperty a las propiedades relevantes y establecer el manejo de esa manera el valor nulo. Consulte la propiedad Reference en el siguiente ejemplo:

Nota: El JsonSerializerSettings anulará los atributos.

public class Person 
{ 
    public int Id { get; set; } 

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public int? Reference { get; set; } 

    public string Name { get; set; } 
} 

Hth.