解析c#中为jtree生成的json文件
本文关键字:json 文件 中为 jtree 解析 | 更新日期: 2023-09-27 18:13:56
我想解析一个动态生成的JSON文件,它没有明确的结构。
[
{
"children": [
{
"children": [
{
"children": [],
"text": "Child node 2.txt",
"isFolder": false,
"id": "1childnode2.txt",
"itsPath": "C:''Users''pandyapa''Root node''Child node 2.txt",
"type": "itsfile"
}
],
"text": "Child node 1.txt",
"isFolder": false,
"id": "0childnode1.txt",
"itsPath": "C:''Users''pandyapa''Root node''Child node 1.txt",
"type": "itsfile"
},
{
"children": [],
"text": "Child node 2.txt",
"isFolder": false,
"id": "1childnode2.txt",
"itsPath": "C:''Users''pandyapa''Root node''Child node 2.txt",
"type": "itsfile"
},
{
"children": [],
"text": "Child node 3.txt",
"isFolder": false,
"id": "2childnode3.txt",
"itsPath": "C:''Users''pandyapa''Root node''Child node 3.txt",
"type": "itsfile"
}
],
"text": "Root node",
"isFolder": true,
"id": "3rootnode",
"itsPath": "C:''Users''pandyapa''Root node",
"type": "default"
}
]
这个JSON可以有任何嵌套的子。我希望解析每个JSON对象,比较其"id"键并检索"itspath"值。我试过了,但没有成功。
在我看来,你的JSON 确实有一个非常明确的结构,可以用这个递归类来表示:
public class Node
{
public Node[] Children { get; set; }
public string Text { get; set; }
public bool IsFolder { get; set; }
public string Id { get; set; }
public string ItsPath { get; set; }
public string Type { get; set; }
}
JSON可能是深度嵌套的,你可能事先不知道每一层有多少层或者有多少个子节点,但事实是每个"节点"都有一个统一的结构。这很好,因为这意味着可以很容易地使用Json.Net等解析器对其进行反序列化。实际上,只需一行代码就可以做到:
List<Node> nodes = JsonConvert.DeserializeObject<List<Node>>(json);
一旦对节点进行了反序列化,就需要能够找到想要的节点。通过在类中引入一个简短的"DescendantsAndSelf"方法,您可以使用LINQ方法使结构可查询。
public IEnumerable<Node> DescendantsAndSelf()
{
yield return this;
if (Children != null)
{
foreach (Node child in Children)
{
yield return child;
}
}
}
现在你可以这样做,通过ID找到一个特定的节点:
var idToFind = "2childnode3.txt";
var node = nodes.SelectMany(n => n.DescendantsAndSelf())
.Where(n => n.Id == idToFind)
.FirstOrDefault();
if (node != null)
{
Console.WriteLine(node.ItsPath);
}
else
{
Console.WriteLine("Not found");
}
小提琴:https://dotnetfiddle.net/u9gDTc