从c#中的json字符串中检索数据

时间:2015-09-04 06:26:27

标签: c# asp.net json

我是json的新手,因为我正在关注json字符串。

我需要在asp.net中使用c#

跟随输出1,2,6,3,5,4(使用逗号分隔 id 对象)
[
  {
    "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 ...

由于

3 个答案:

答案 0 :(得分:2)

对于这种递归定义,Json到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();

答案 1 :(得分: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响应。

答案 2 :(得分: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);