2017-05-26 160 views
3

我想通過使用C#和JSON.NET迭代嵌套的JSON數組。 JSON代表在線網店的類別 - 下面是一個例子。我的目標是創建一個所有類別名稱的列表。C#從嵌套數組中提取JSON

{ 
    "id": 2, 
    "parent_id": 1, 
    "name": "Main Category List", 
    "is_active": true, 
    "position": 1, 
    "level": 1, 
    "product_count": 0, 
    "children_data": [ 
    { 
     "id": 9, 
     "parent_id": 2, 
     "name": "Mens Clothing", 
     "is_active": true, 
     "position": 6, 
     "level": 2, 
     "product_count": 0, 
     "children_data": [] 
    }, 
    { 
     "id": 8, 
     "parent_id": 2, 
     "name": "Womens Clothing", 
     "is_active": true, 
     "position": 7, 
     "level": 2, 
     "product_count": 0, 
     "children_data": [ 
     { 
      "id": 223, 
      "parent_id": 8, 
      "name": "Outdoor Clothing", 
      "is_active": true, 
      "position": 1, 
      "level": 3, 
      "product_count": 0, 
      "children_data": [] 
     }, 
     { 
      "id": 224, 
      "parent_id": 8, 
      "name": "Hiking Clothing", 
      "is_active": true, 
      "position": 2, 
      "level": 3, 
      "product_count": 0, 
      "children_data": [] 
     }, 
     { 
      "id": 596, 
      "parent_id": 8, 
      "name": "Dresses", 
      "is_active": true, 
      "position": 3, 
      "level": 3, 
      "product_count": 0, 
      "children_data": [ 
      { 
       "id": 694, 
       "parent_id": 596, 
       "name": "Summer Dresses", 
       "is_active": true, 
       "position": 13, 
       "level": 4, 
       "product_count": 0, 
       "children_data": [ 
       { 
        "id": 720, 
        "parent_id": 694, 
        "name": "Accessories", 
        "is_active": true, 
        "position": 1, 
        "level": 5, 
        "product_count": 0, 
        "children_data": [ ] 
       } 
       ] 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     "id": 10, 
     "parent_id": 2, 
     "name": "Sale & Clearance", 
     "is_active": true, 
     "position": 8, 
     "level": 2, 
     "product_count": 0, 
     "children_data": [] 
    } 
    ] 
} 

可能有不同級別的類別,我需要解析每一個。我想要獲得每個類別並創建一個地圖。例如(主要分類目錄 - >女裝 - >戶外服裝)。我想我可以檢查兒童數據的深度,但我不知道如何更深入地檢查下一個Json對象。

JObject responseObject = JObject.Parse(response.Content); 


foreach (JObject category in getCatResponseObj.SelectToken("children_data")) 
{ 
    while loop checking depth of children_data 



} 

回答

0

這似乎是一個遞歸定義的結構。您應該創建一個函數來提取每個孩子的值,以便您可以遞歸地重用它。

IEnumerable<string> GetCategoryNames(JObject data) 
{ 
    yield return (string)data["name"]; 
    foreach (var name in data["children_data"].Cast<JObject>().SelectMany(GetCategoryNames)) 
     yield return name; 
} 

然後在根對象上調用它以將您的名字放在列表中或其他內容中。

var obj = JObject.Parse(response.Content); 
var names = GetCategoryNames(obj).ToList(); 

否則,如果你想胡亂得到所有的名字對象樹,只是記住,SelectToken()/SelectTokens()也需要JSON路徑查詢。因此,要獲得所有後代的所有名稱,你只是這樣做:

let names = obj.SelectTokens("..name").ToList(); 
0

要不是我,我會創造最完整的JSON文件,我可以想出(包括所有可能的條目),然後使用json2csharp或者用於創建c#類的等效工具,然後反序列化Json並在本地處理它。你可能需要按摩一下結果 - 但我認爲你可以到達那裏。如果這沒有奏效,我會使用Newtonsofts JSON LINQ功能(documentation)。 JToken給你父母/孩子的組合,讓你可以在樹上上下移動。文檔中的示例非常好,因此不需要填充重複信息的頁面。

(從你的榜樣產生的)

public class ChildrenData 
{ 
    public int id { get; set; } 
    public int parent_id { get; set; } 
    public string name { get; set; } 
    public bool is_active { get; set; } 
    public int position { get; set; } 
    public int level { get; set; } 
    public int product_count { get; set; } 
    public List<object> children_data { get; set; } 
} 

public class RootObject 
{ 
    public int id { get; set; } 
    public int parent_id { get; set; } 
    public string name { get; set; } 
    public bool is_active { get; set; } 
    public int position { get; set; } 
    public int level { get; set; } 
    public int product_count { get; set; } 
    public List<ChildrenData> children_data { get; set; } 
}