2015-09-04 30 views
2

我是新的json,因爲我越來越關注json字符串。從c#中的json字符串檢索數據#

我需要下面的輸出1,2,6,3,5,4(得到ID用逗號分隔對象)在asp.net用c#

[ 
    { 
    "id":1, 
    "children": 
     [ 
      { 
      "id":2, 
      "children" : 
       [ 
       {"id":6}, 
       {"id":3}, 
       ] 
      } 
     ] 
    }, 
    { 
     "id":5 
    }, 
    { 
    "id":4 
    } 

]

碼工作的背後:

public class GetId 
{ 
    public string id { get; set; } 

} 

    List<GetId> myDeserializedObjList = (List<GetId>)Newtonsoft.Json.JsonConvert.DeserializeObject(nestable_list_1_output.InnerText, typeof(List<GetId>)); 
    for(int i=0; i < myDeserializedObjList.Count;i++) 
    { 
     string Id = myDeserializedObjList[i].id.ToString(); 

    } 

後實現這一點,我得到的只有1,5,4 ......我也想孩子的對象ID ..

感謝

回答

2

對於這個遞歸定義,Json to c#轉換器不會很好地工作。事實上,你的班級很簡單

public class ID 
{ 
    public int id { get; set; } 
    public List<ID> children { get; set; } 
} 

你的json現在可以在任何深度。所有你需要做的就是

var myDeserializedObjList = JsonConvert.DeserializeObject<List<ID>>(json); 

你現在可以得到的結果遞歸

PrintMyObject(myDeserializedObjList); 

void PrintMyObject(List<ID> ids) 
{ 
    foreach (var id in ids) 
    { 
     Console.WriteLine(id.id); 
     if (id.children != null) 
      PrintMyObject(id.children); 
    } 
} 

爲了使答案完整:這部分是一個LINQ招,扁平化您的遞歸數據結構。

Func<List<ID>, IEnumerable<ID>> flattenList = null; 
flattenList = l => l.SelectMany(x => new[] { x }.Concat(x.children==null 
                 ? Enumerable.Empty<ID>() 
                 : flattenList(x.children))); 

var flatList = flattenList(myDeserializedObjList).ToList(); 
+0

謝謝:) @Eser ... – user3090790

1

使用json2csharp生成正確的類結構 -

public class Child2 
{ 
    public int id { get; set; } 
} 

public class Child 
{ 
    public int id { get; set; } 
    public List<Child2> children { get; set; } 
} 

public class RootObject 
{ 
    public int id { get; set; } 
    public List<Child> children { get; set; } 
} 

使用此類RootObject反序列化JSON響應。

1

你應該在你的GETID類的定義兒童。

public class GetId 
{ 
    public int id { get; set; } 
    public List<GetId> children { get; set; } 
} 

然後,當收集id的時候,你可以使用遞歸調用來確保你在下面的結構中獲得所有的id。

private void CollectIdValues(List<GetId> list, List<int> ids){ 
    foreach(GetId item in list){ 
     ids.Add(item.id); 
     if(item.children != null){ 
      CollectIdValues(item.children, ids); 
     } 
    } 
} 

List<GetId> myDeserializedObjList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GetId>>(jsonString)); 
List<int> allIds = new List<int>(); 
CollectIdValues(myDeserializedObjList, allIds);