2015-03-12 7 views
19

ho elenco degli oggetti della seguente classe:Newtonsoft.Json serializzazione restituisce oggetto vuoto JSON

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

quando sto convertendo questa lista per stringa JSON utilizzando Newtonsoft.Json restituisce array di oggetti vuoti.

string json=JsonConvert.SerializeObject(list); 

Ho ottenuto il seguente risultato.

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

Please help me per quanto riguarda questo problema.

+0

Sei sicuro che la lista non sia la lista degli Oggetti Null. Come hai dichiarato il costruttore 'Parameterzied'. Se vuoi creare un oggetto vuoto devi dichiarare manualmente il costruttore 'empty' in classe. –

+0

sì non ci sono oggetti nulli nella lista – VIVEK

+0

Stavo avendo lo stesso problema usando la libreria di Jackson. Rendere pubblici i campi ha risolto il problema anche lì. – FrancisA

risposta

50

Per impostazione predefinita, NewtonSoft.Json serializzare solo membri pubblici, in modo da rendere i vostri campi pubblici:

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: Se per qualche motivo davvero non si vuole fare i campi pubblici, può invece li decorare con la JsonPropertyAttribute per consentire loro di essere serializzati e deserializzati:

[JsonProperty] 
int catagoryId; 
+0

Ok, grazie. Ha risolto il problema. – VIVEK

+2

Membri pubblici della classe Non è la soluzione migliore. Esiste un'altra soluzione migliore? –

+10

@IgnacioChiazzo Sì, dovresti essere in grado di utilizzare ['JsonPropertyAttribute'] (http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm) per indicare che un campo o proprietà non pubblica deve essere serializzato: '[JsonProperty] private int categoryId;' – JLRishe

3

si potrebbe anche decorare la vostra classe per serializzare tutti i membri che si desidera, senza dover specificare [JsonProperty] per ciascuno di loro.

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

Il MemberSerialization enum permette di specificare ciò che i membri si desidera serializzare:

  • MemberSerialization.OptOut: Tutti i membri pubblici vengono serializzati.
  • MemberSerialization.OptIn: solo i membri contrassegnati con JsonPropertyAttribute o DataMemberAttribute sono serializzati.
  • MemberSerialization.Fields: Tutti i membri pubblici e privati ​​sono serializzati.
+0

Grazie per le informazioni utili. – VIVEK