我是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 ...
由于
答案 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);