OP更改了问题,因此以下内容基于上一个问题:
如果您控制输出,那么您应该使用 XML 作为您的传输语言。它使用起来非常简单,并且在 C# 中内置了对它的支持。
你的结果来自这个:
{"id":1},{"id":2->"children":{"id":3},{"id":4->"children":{"id":5->"children":{"id":6}}},{"id":7}}
会成为:
<root>
<item id="1" />
<item id="2">
<item id="3" />
<item id="4">
<item id="5">
<item id="6" />
</item>
</item>
<item id="7" />
</item>
</root>
然后你可以阅读它:
XElement root = XElement.Parse(xml); // or .Load(file)
Dictionary<int,int?> list = root.Descendants("item")
.ToDictionary(x => (int)x.Attribute("id"), x =>
{
var parentId = x.Parent.Attribute("id");
if (parentId == null)
return null;
return (int)parentId;
});
现在你有了一个键值对的字典列表,就像你想要的那样
ID | ParentID
------------------------
1 NULL
2 NULL
3 2
4 2
5 4
6 5
7 2
=== 转换回来 ===
Dictionary<int, int?> dic = new Dictionary<int, int?>
{
{1,null},
{2,null},
{3,2},
{4,2},
{5,4},
{6,5},
{7,2}
};
XElement root = new XElement("root");
foreach (var kvp in dic)
{
XElement node = new XElement("item", new XAttribute("id", kvp.Key));
int? parentId = kvp.Value;
if (null == parentId)
root.Add(node);
else
{
// Get first item with id of parentId
XElement parent = root.Descendants("item")
.FirstOrDefault(i => (int)i.Attribute("id") == (int)parentId);
if (null != parent) // which it shouldn't for our array
parent.Add(node);
}
}
要获取字符串,请使用:
string xml = root.ToString();
或保存到文件:
root.Save("filepath");