在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 ..
谢谢
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);