2015-11-17 13 views
5

Tôi đang sử dụng serializer Newtonsoft JSON, và chuỗi tuần tự hóa bị thiếu các thuộc tính từ lớp dẫn xuất nếu lớp được bắt nguồn từ một danh sách. Đây là mã ví dụ của tôi.JSON serialization thiếu thuộc tính trong lớp dẫn xuất

Lớp học:

[DataContract] 
public class TestItem 
{ 
    [DataMember] 
    public int itemInt; 
    [DataMember] 
    public string itemString; 

    public TestItem() {} 
    public TestItem(int _intVal, string _stringVal) 
    { 
     itemInt = _intVal; 
     itemString = _stringVal; 
    } 
} 

[DataContract] 
public class TestMain : List<TestItem> 
{ 
    [DataMember] 
    public int mainInt; 
    [DataMember] 
    public string mainString; 
} 

đang Serializing:

string test; 

// Test classes 
TestMain main = new TestMain(); 
main.mainInt = 123; 
main.mainString = "Hello"; 
main.Add(new TestItem(1, "First")); 

test = Newtonsoft.Json.JsonConvert.SerializeObject(main); 

Sau serialization, giá trị của thử nghiệm là:

[{\ "itemInt \": 1, \" itemString \ ": \" Đầu tiên \ "}]

Các giá trị cho mainInt và mainString bị thiếu hoàn toàn.

Hành vi không bị thay đổi bởi thẻ [DataContract] và [DataMember], nhưng tôi có chúng ở đó, để đặt trước câu trả lời mà chúng bị thiếu.

Làm cách nào để nhận JSON nhận biết và tuần tự hóa các thuộc tính mainInt và mainString của lớp dẫn xuất?

Trả lời

0

Hãy xem xét việc đưa những người gác cổng vào tài sản của bạn. Đây là mẫu: Json.NET serialize object with root name. Điều duy nhất tôi sẽ ngần ngại làm là có được nguồn gốc chính từ danh sách như thế. Nó không phải là một mô hình được đề nghị và thực hành. thêm danh sách dưới dạng thuộc tính con khác thay vì xuất phát từ danh sách, sắp xếp tuần tự json bị nhầm lẫn với ý định của bạn.

+0

Ý tưởng tốt, nhưng vẫn không hoạt động. Khi tôi gắn thẻ TestMain là một JsonObject, mainInt và mainString đi qua, nhưng các mục danh sách thì không! – user1961169

+0

Có danh sách như một tài sản của TestMain sẽ là một giải pháp (JSON hoạt động tốt với điều đó), nhưng tiếc là điều đó sẽ ảnh hưởng đến mã khác mà chúng tôi không kiểm soát được - có mã bên thứ 3 sử dụng các lớp này, một Danh sách <>. – user1961169

0

Đây có phải là những gì bạn muốn không?

[DataContract] 
public class TestItem 
{ 
    [DataMember] 
    public int itemInt { get; set; } 
    [DataMember] 
    public string itemString { get; set; } 

    public TestItem() { } 
    public TestItem(int _intVal, string _stringVal) 
    { 
     itemInt = _intVal; 
     itemString = _stringVal; 
    } 
} 

[DataContract] 
public class TestMain 
{ 
    [DataMember] 
    public int mainInt { get; set; } 
    [DataMember] 
    public string mainString { get; set; } 
    [DataMember] 
    public List<TestItem> TestItem = new List<TestItem>(); 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string test; 

     // Test classes 
     TestMain main = new TestMain(); 
     main.mainInt = 123; 
     main.mainString = "Hello"; 
     main.TestItem.Add(new TestItem(1, "First")); 
     test = Newtonsoft.Json.JsonConvert.SerializeObject(main); 
     Console.WriteLine(test); 
    } 
} 
+1

Điều này sẽ giải quyết vấn đề JSON, nhưng tiếc là chúng tôi không thể làm điều này. Mã bên thứ 3 hiện có sử dụng lớp TestMain, vì vậy lớp TestMain không thể sửa đổi để có danh sách như một thuộc tính. TestMain phải duy trì như được lấy từ Danh sách . – user1961169

+0

Vì vậy, bạn có thể sửa đổi lớp TestItem? – MichaelMao

+1

Không, chúng tôi không thể sửa đổi bất kỳ lớp học nào. : ( – user1961169

0

thêm attrib này làm việc cho tôi:

sử dụng System.ComponentModel.DataAnnotations;

[Newtonsoft.Json.JsonObject (Title = "root")] public class Testmain: Danh sách

+0

Cảm ơn, [JsonObject] đã làm việc cho tôi để có được một lớp dẫn xuất được sắp xếp theo thứ tự. Nhưng nó đã tuần tự hóa mọi thứ ngay cả những thứ trong lớp cơ sở mà không được tuần tự hóa ban đầu, vì vậy thay vào đó [JsonProperty] trên các thuộc tính bị thiếu tôi. – Andy

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