2016-08-05 60 views
5

Tôi nhận JSON trở lại từ một API mà trông như thế này:Deserialize lồng nhau JSON vào C# đối tượng

{ 
    "Items": { 
    "Item322A": [{ 
     "prop1": "string", 
     "prop2": "string", 
     "prop3": 1, 
     "prop4": false 
    },{ 
     "prop1": "string", 
     "prop2": "string", 
     "prop3": 0, 
     "prop4": false 
    }], 
     "Item2B": [{ 
     "prop1": "string", 
     "prop2": "string", 
     "prop3": 14, 
     "prop4": true 
    }] 
    }, 
    "Errors": ["String"] 
} 

Tôi đã thử một vài phương pháp để đại diện cho JSON này trong C# đối tượng (quá nhiều để liệt kê ở đây). Tôi đã thử với danh sách và từ điển, đây là một ví dụ gần đây như thế nào tôi đã cố gắng để thể hiện nó:

private class Response 
    { 
     public Item Items { get; set; } 
     public string[] Errors { get; set; } 
    } 

    private class Item 
    { 
     public List<SubItem> SubItems { get; set; } 
    } 

    private class SubItem 
    { 
     public List<Info> Infos { get; set; } 
    } 

    private class Info 
    { 
     public string Prop1 { get; set; } 
     public string Prop2 { get; set; } 
     public int Prop3 { get; set; } 
     public bool Prop4 { get; set; } 
    } 

Và đây là phương pháp tôi đang sử dụng để deserialize JSON:

using (var sr = new StringReader(responseJSON)) 
    using (var jr = new JsonTextReader(sr)) 
    { 
     var serial = new JsonSerializer(); 
     serial.Formatting = Formatting.Indented; 
     var obj = serial.Deserialize<Response>(jr); 
    } 

obj chứa ItemsErrors. Và Items chứa SubItems, nhưng SubItemsnull. Vì vậy, không có gì ngoại trừ Errors thực sự đang được deserialized.

Nó phải là đơn giản, nhưng đối với một số lý do tôi không thể tìm ra các đại diện đối tượng đúng

Trả lời

8

Đối "Items" sử dụng một Dictionary<string, List<Info>>, ví dụ:

class Response 
{ 
    public Dictionary<string, List<Info>> Items { get; set; } 
    public string[] Errors { get; set; } 
} 

class Info 
{ 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public int Prop3 { get; set; } 
    public bool Prop4 { get; set; } 
} 

này giả định rằng tên mục "Item322A""Item2B" sẽ thay đổi từ đối phó với phản ứng, và đọc các tên này dưới dạng các phím từ điển.

Mẫu fiddle.

+0

Thật tuyệt, tôi sẽ thử điều này. Tôi chỉ thử một cách tiếp cận tương tự, nhưng đã có từ điển được bọc trong một danh sách! – user3574076

+0

Điều này đã hiệu quả. Hóa ra nỗ lực cuối cùng của tôi là * rất gần * – user3574076

10

Sử dụng này trang web này cho đại diện:

http://json2csharp.com/

một cái gì đó như thế này có thể giúp bạn

public class Item322A 
{ 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
    public int prop3 { get; set; } 
    public bool prop4 { get; set; } 
} 

public class Item2B 
{ 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
    public int prop3 { get; set; } 
    public bool prop4 { get; set; } 
} 

public class Items 
{ 
    public List<Item322A> Item322A { get; set; } 
    public List<Item2B> Item2B { get; set; } 
} 

public class jsonObject 
{ 
    public Items Items { get; set; } 
    public List<string> Errors { get; set; } 
} 

Đây là cách để deserialize (sử dụng JsonConvert lớp):

jsonObject ourlisting = JsonConvert.DeserializeObject<jsonObject>(strJSON); 
+0

Mục322A và Item2B không phải là hằng số. Nhưng cảm ơn câu trả lời – user3574076

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