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

本文关键字:检索 数据 字符串 json 中从 | 更新日期: 2023-09-27 18:11:12

我是新的json,因为我得到以下json字符串。

我需要以下输出1,2,6,3,5,4 (get id object with逗号分隔)在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 ..

谢谢

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

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();

使用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响应。

您应该在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);