2015-03-12 11 views
19

I Liste der Objekte der folgenden Klasse:Newtonsoft.Json Serialisierung kehrt leer json Objekt

public class Catagory 
{ 
    int catagoryId; 
    string catagoryNameHindi; 
    string catagoryNameEnglish; 
    List<Object> subCatagories; 
    public Catagory(int Id, string NameHindi, string NameEng,List<Object> l) 
    { 
     this.catagoryId = Id; 
     this.catagoryNameHindi = NameHindi; 
     this.catagoryNameEnglish = NameEng; 
     this.subCatagories = l; 
    } 
} 

    public class SubCatagory 
{ 
    int subCatagoryId { get; set; } 
    string subCatNameHindi { get; set; } 
    string subCatNameEng { get; set; } 

    public SubCatagory(int Id, string NameHindi, string NameEng) 
    { 
     this.subCatagoryId = Id; 
     this.subCatNameEng = NameEng; 
     this.subCatNameHindi = NameHindi; 
    } 
} 

, wenn ich diese Liste, um JSON-String am Umwandlung von Newtonsoft.Json mit ihm Array von leeren Objekten zurückgibt.

string json=JsonConvert.SerializeObject(list); 

Ich bekomme folgendes Ergebnis.

[{} {} {} {} {}]

Bitte helfen Sie mir dieses Problem in Bezug auf.

+0

Sind Sie sicher, dass die Liste nicht die Liste der Null-Objekte ist. Wie Sie "Parameterzied" -Konstruktor deklariert haben. Wenn Sie ein leeres Objekt erstellen möchten, müssen Sie den Konstruktor 'empty' in der Klasse manuell deklarieren. –

+0

Ja, es gibt keine Null-Objekte in der Liste – VIVEK

+0

Ich hatte das gleiche Problem mit der Jackson-Bibliothek. Die Freigabe der Felder löste das Problem auch dort. – FrancisA

Antwort

50

Standardmäßig wird NewtonSoft.Json nur öffentliche Mitglieder serialisiert werden, so stellen Sie Ihre Felder public:

public class Catagory 
{ 
    public int catagoryId; 
    public string catagoryNameHindi; 
    public string catagoryNameEnglish; 
    public List<Object> subCatagories; 

    public Catagory(int Id, string NameHindi, string NameEng, List<Object> l) 
    { 
     this.catagoryId = Id; 
     this.catagoryNameHindi = NameHindi; 
     this.catagoryNameEnglish = NameEng; 
     this.subCatagories = l; 
    } 
} 

Edit: Wenn aus irgendeinem Grund Sie wirklich nicht wollen, Ihre Felder öffentlich machen, Sie kann, anstatt sie mit den JsonPropertyAttribute dekorieren, damit sie serialisiert und deserialisiert wird:

[JsonProperty] 
int catagoryId; 
+0

Ok danke. Es hat das Problem gelöst. – VIVEK

+2

Öffentliche Mitglieder der Klasse ist nicht die beste Lösung. Gibt es eine andere bessere Lösung? –

+10

@IgnacioChiazzo Ja, Sie sollten das ['JsonPropertyAttribute'] (http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm) verwenden können, um anzugeben, dass ein nicht öffentliches Feld oder eine nicht öffentliche Eigenschaft sein sollte serialisiert: '[JsonProperty] private int categoryId;' – JLRishe

3

könnten Sie auch Ihre Klasse dekorieren alle Mitglieder serialisiert werden Sie ohne für jeden [JsonProperty] angeben müssen wollen von Sie.

[JsonObject(MemberSerialization.OptOut)] 
public class Catagory { 
    ... 
} 

Die MemberSerialization Enum können Sie festlegen, welche Mitglieder Sie serialisieren möchten:

  • MemberSerialization.OptOut: Alle öffentlichen Mitglieder serialisiert werden.
  • MemberSerialization.OptIn: Nur Mitglieder, die mit JsonPropertyAttribute oder DataMemberAttribute markiert sind, werden serialisiert.
  • MemberSerialization.Fields: Alle öffentlichen und privaten Mitglieder sind serialisiert.
+0

Danke für die nützliche Information. – VIVEK

Verwandte Themen