2015-03-12 9 views
19

Mam listę obiektów następującej klasy:Newtonsoft.Json serializacji json zwraca pusty obiekt

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

kiedy jestem konwersja tę listę json ciąg za pomocą Newtonsoft.Json zwraca tablicę pustych obiektów.

string json=JsonConvert.SerializeObject(list); 

Otrzymuję następujący wynik.

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

Proszę mi pomóc w sprawie tego problemu.

+0

Czy jesteś pewien, że lista nie jest listą obiektów NULL. Jak zadeklarowałeś konstruktora "Parameterzied". Jeśli chcesz utworzyć pusty obiekt, musisz ręcznie zadeklarować 'pusty' konstruktor w klasie. –

+0

Tak, nie ma żadnych obiektów o wartości NULL na liście – VIVEK

+0

Miałem ten sam problem przy użyciu biblioteki Jacksona. Upublicznienie tych pól także rozwiązało problem. – FrancisA

Odpowiedz

50

Domyślnie NewtonSoft.Json będzie serializacji tylko członków publicznych, tak aby Twoje pola 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: Jeśli z jakiegoś powodu naprawdę nie chcesz, aby Twoje pola publicznego, Państwo może zamiast ozdobić je z JsonPropertyAttribute aby mogły być szeregowane i rozszeregować:

[JsonProperty] 
int catagoryId; 
+0

Ok dzięki. Rozwiązał problem. – VIVEK

+2

Publiczni członkowie klasy Nie jest najlepszym rozwiązaniem. Czy istnieje inne lepsze rozwiązanie? –

+10

@IgnacioChiazzo Tak, powinieneś być w stanie użyć ['JsonPropertyAttribute'] (http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm), aby wskazać, że niepubliczne pole lub własność powinny być serializowane: '[JsonProperty] private int categoryId;' – JLRishe

3

można również ozdobić swoją klasę do serializacji wszystkich członków chcesz bez konieczności określania [JsonProperty] dla każdego im.

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

MemberSerialization enum pozwala określić, jakie członkowie chcesz serializacji:

  • MemberSerialization.OptOut: Wszyscy członkowie publiczne są szeregowane.
  • MemberSerialization.OptIn: Tylko członkowie oznaczeni JsonPropertyAttribute lub DataMemberAttribute są serializowane.
  • MemberSerialization.Fields: Wszyscy publiczni i prywatni członkowie są serializowane.
+0

Dzięki za przydatne informacje. – VIVEK