解析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"值。我试过了,但没有成功。

解析c#中为jtree生成的json文件

在我看来,你的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