簡體   English   中英

在C#中解析為jstree生成的json文件

[英]Parse a json file generated for jstree in C#

我希望解析一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM