2012-08-14 15 views
9

Si tengo una clase como esta:deserializar tal que un campo es una lista vacía en lugar de nulo

[DataContract(Name = "", Namespace = "")] 
public class MyDataObject 
{ 
    [DataMember(Name = "NeverNull")] 
    public IList<int> MyInts { get; set; } 
} 

¿Hay alguna manera de que el campo de MyInts una lista vacía no nulo cuando la siguiente cadena es deserializado?

string serialized = @"{""NeverNull"":null}"; 

MyDataObject myDataObject = JsonConvert.DeserializeObject<MyDataObject>(serialized); 

estoy usando Newtonsoft.Json

La razón que pido es que tengo una solicitud JSON bastante complicado de analizar, que contiene nidos de listas de objetos y me gustaría el código de deserialización crear estos objetos para que pueda evitar un montón de cheques nulos:

if (foo.bar != null) 
{ 
    foreach (var bar in foo.bar) 
    { 
     if (bar.baz != null) 
     { 
      foreach (var baz in bar.baz) 
      { 
       ... 

Respuesta

10

quizás añadir una devolución de llamada posterior a la serialización que comprueba esto al final de deserialización?

[DataContract(Name = "", Namespace = "")] 
public class MyDataObject 
{ 
    [OnDeserialized] 
    public void OnDeserialized(StreamingContext context) 
    { 
     if (MyInts == null) MyInts = new List<int>(); 
    } 
    [DataMember(Name = "NeverNull")] 
    public IList<int> MyInts { get; set; } 
} 

Nótese también que JsonConvert (a diferencia de DataContractSerializer) ejecuta el constructor por defecto, por lo generalmente también podría haber añadido un constructor por defecto: sin embargo

public MyDataObject() 
    { 
     MyInts = new List<int>(); 
    } 

, en este caso el explict"NeverNull":null lo vuelve a cambiar a null durante la deserialización, de ahí que haya usado una devolución de llamada anterior.

+0

Perfecto - gracias! –

1

Inicialización de IList<int> con new int[0] le ayudará! Es la solución que me da los mejores resultados.

Cuestiones relacionadas