2015-03-12 16 views
19

Tôi có danh sách các đối tượng của lớp sau:Newtonsoft.Json serialization trả về rỗng json đối tượng

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

khi tôi chuyển đổi danh sách này để chuỗi json bằng cách sử dụng Newtonsoft.Json nó sẽ trả về mảng các đối tượng rỗng.

string json=JsonConvert.SerializeObject(list); 

Tôi nhận được kết quả sau.

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

Xin hãy giúp tôi về vấn đề này.

+0

Bạn có chắc danh sách không phải là danh sách các đối tượng không. Khi bạn đã khai báo hàm tạo 'Parameterzied'. Nếu bạn muốn tạo đối tượng rỗng thì bạn phải khai báo thủ công hàm tạo 'empty' trong lớp. –

+0

vâng, không có đối tượng null nào trong danh sách – VIVEK

+0

Tôi gặp vấn đề tương tự khi sử dụng thư viện Jackson. Làm cho các lĩnh vực công cộng giải quyết vấn đề đó quá. – FrancisA

Trả lời

50

Theo mặc định, NewtonSoft.Json sẽ chỉ serialize các thành viên cộng đồng, do đó hãy chắc lĩnh vực của bạn công cộng:

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: Nếu vì một lý do nào bạn thực sự không muốn làm cho các lĩnh vực của bạn công cộng, bạn thay vào đó có thể trang trí chúng với JsonPropertyAttribute để cho phép họ được serialized và deserialized:

[JsonProperty] 
int catagoryId; 
+0

Ok cảm ơn. Nó giải quyết vấn đề. – VIVEK

+2

Các thành viên của lớp học Không phải là giải pháp tốt nhất. Có tồn tại giải pháp tốt hơn khác? –

+10

@IgnacioChiazzo Có, bạn sẽ có thể sử dụng ['JsonPropertyAttribute'] (http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm) để chỉ ra rằng một trường hoặc thuộc tính không công khai phải là serialized: '[JsonProperty] private int categoryId;' – JLRishe

3

bạn cũng có thể trang trí lớp học của bạn để serialize tất cả các thành viên mà bạn muốn mà không cần phải chỉ định [JsonProperty] cho mỗi chúng.

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

Các MemberSerialization enum cho phép bạn xác định những thành viên mà bạn muốn serialize:

  • MemberSerialization.OptOut: Tất cả các thành viên cộng đồng là serialized.
  • MemberSerialization.OptIn: Chỉ các thành viên được đánh dấu bằng JsonPropertyAttribute hoặc DataMemberAttribute mới được đăng.
  • MemberSerialization.Fields: Tất cả các thành viên công khai và riêng tư được đăng.
+0

Thanx để biết thông tin hữu ích. – VIVEK

Các vấn đề liên quan