2012-08-14 10 views
9

Se ho una classe come questa:deserializzazione in modo tale che un campo è un elenco vuoto, piuttosto che nulla

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

c'è un modo posso fare MyInts campo una lista vuota non nullo quando la seguente stringa è deserializzati?

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

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

sto usando Newtonsoft.Json

Il motivo che mi chiedo è che ho una richiesta JSON abbastanza complicato da analizzare, contiene nidi di elenchi di oggetti e vorrei il codice deserializzazione per creare questi oggetti così posso evitare un sacco di controlli nulli:

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

risposta

10

Forse aggiungere un callback post-serializzazione che controlla questo alla fine di deserializzazione?

[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; } 
} 

Si noti inoltre che JsonConvert (a differenza DataContractSerializer) esegue il costruttore predefinito, in modo solito si potrebbe anche appena aggiunto un costruttore di default:

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

tuttavia, in questo caso il explict"NeverNull":null lo cambia di nuovo a null durante la deserializzazione, quindi perché ho usato una richiamata sopra invece.

+0

Perfetto - grazie! –

1

L'inizializzazione di IList<int> con new int[0] ti aiuterà! È la soluzione che mi dà i migliori risultati.

Problemi correlati