2012-08-14 17 views
9

Jeśli mam klasy jak poniżej:deserializacji tak, że pole jest pusta lista zamiast NULL

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

Czy istnieje sposób mogę uczynić pole MyInts niepustą listę pustą gdy następujący ciąg jest deserialized?

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

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

Używam Newtonsoft.Json

Pytam się, że mam dość skomplikowany wniosek json do analizowania, zawiera gniazda list obiektów i chciałbym kodu deserializacjia do tworzenia tych obiektów, dzięki czemu można uniknąć wiele kontroli zerowych:

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

Odpowiedz

10

może dodają zwrotnego po serializacji który sprawdza to na koniec deserializacji?

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

Należy również zauważyć, że JsonConvert (w przeciwieństwie DataContractSerializer) wykonuje konstruktora domyślnie, więc zwykle można też po prostu dodać do domyślnego konstruktora:

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

jednak w tym przypadku explict"NeverNull":null zmienia to z powrotem na null podczas deserializacji, dlatego zamiast tego użyłem powyższego wywołania zwrotnego.

+0

Idealny - dzięki! –

1

Inicjalizacja IList<int> z IList<int> z new int[0] pomoże! To rozwiązanie, które daje mi najlepsze wyniki.

Powiązane problemy