首页 > 解决方案 > 如何在c#中将json字符串格式化为树格式

问题描述

我有一个来自 Mongo 数据库的数据列表。内容为 JSON 格式。它是一个对象数组,并且值彼此之间具有父关系。父对象为 null("") 表示它是根节点。

[  
   {  
      "_id":"5c04fc163838b0772dd9636d",
      "Company":"TESTCOMPANY",
      "id":"test_uk",
      "parent":""
   },
   {  
      "_id":"5c05181f0ab89a44a969015d",
      "Company":"TESTCOMPANY",
      "id":"Gateway",
      "parent":"test_uk"
   },
   {  
      "_id":"5c0518723838b0772dd9678e",
      "Company":"TESTCOMPANY",
      "id":"Device1",
      "parent":"Gateway"
   },
{  
      "_id":"5c0518723838b077789636e",
      "Company":"TESTCOMPANY",
      "id":"Device2",
      "parent":"Gateway"
   },
   {  
      "_id":"5c0518723838b0772dd9636e34",
      "Company":"TESTCOMPANY",
      "id":"Adapter",
      "parent":"test_uk"
   },
      {  
      "_id":"5c0518723838b0772dd9636e",
      "Company":"TESTCOMPANY",
      "id":"AdapterDevice",
      "parent":"Adapter"
   },

   {  
      "_id":"5c04fc163838b0772dd93454d",
      "Company":"TESTCOMPANY",
      "id":"test_us",
      "parent":""
   },
   {  
      "_id":"5c0518723838b0772dd9636e",
      "Company":"TESTCOMPANY",
      "id":"Device",
      "parent":"test_us"
   }
]

是否可以在c#中转换为父子格式?

预期格式

[  
   {  
      "_id":"5c04fc163838b0772dd9636d",
      "Company":"TESTCOMPANY",
      "id":"test_uk",
      "children":[
             {  
                 "_id":"5c05181f0ab89a44a969015d",
                  "Company":"TESTCOMPANY",
                  "id":"Gateway",
                  "children":[
                      {  
                       "_id":"5c0518723838b0772dd9678e",
                       "Company":"TESTCOMPANY",
                       "id":"Device1"
                      },
                     {  
                      "_id":"5c0518723838b077789636e",
                      "Company":"TESTCOMPANY",
                      "id":"Device2"
                       }
                    ]
               },
        {  
           "_id":"5c0518723838b0772dd9636e34",
           "Company":"TESTCOMPANY",
           "id":"Adapter",
        "children":[  {  
             "_id":"5c0518723838b0772dd9636e",
             "Company":"TESTCOMPANY",
             "id":"AdapterDevice"
            }]
       }]},
     {  
      "_id":"5c04fc163838b0772dd93454d",
      "Company":"TESTCOMPANY",
      "id":"test_us",
  "children":[{
      "_id":"5c0518723838b0772dd9636e",
      "Company":"TESTCOMPANY",
      "id":"Device",
      "parent":"test_us"
     }]
    }
]

我只想在 web Ui 中显示这种格式树结构

标签: c#.netjsontree

解决方案


我不确定它是否足够快,但它可能是一个可能的解决方案:

using System.Collections.Generic;
using Newtonsoft.Json;

namespace ConsoleApp1
{
    class Program
    {
        public class Item
        {
            [JsonProperty("_id")]
            public string Guid { get; set; }

            [JsonProperty(PropertyName = "company")]
            public string Company { get; set; }

            [JsonProperty(PropertyName = "id")]
            public string Id { get; set; }

            [JsonProperty(PropertyName = "parent")]
            public string Parent { get; set; }

            [JsonProperty(PropertyName = "children")]
            public List<Item> Children { get; set; }
        }


        private static string jsonString = "[{\"_id\":\"5c04fc163838b0772dd9636d\",\"Company\":\"TESTCOMPANY\",\"id\":\"test_uk\",\"parent\":\"\"},{\"_id\":\"5c05181f0ab89a44a969015d\",\"Company\":\"TESTCOMPANY\",\"id\":\"Gateway\",\"parent\":\"test_uk\"},{\"_id\":\"5c0518723838b0772dd9678e\",\"Company\":\"TESTCOMPANY\",\"id\":\"Device1\",\"parent\":\"Gateway\"},{\"_id\":\"5c0518723838b077789636e\",\"Company\":\"TESTCOMPANY\",\"id\":\"Device2\",\"parent\":\"Gateway\"},{\"_id\":\"5c0518723838b0772dd9636e34\",\"Company\":\"TESTCOMPANY\",\"id\":\"Adapter\",\"parent\":\"test_uk\"},{\"_id\":\"5c0518723838b0772dd9636e\",\"Company\":\"TESTCOMPANY\",\"id\":\"AdapterDevice\",\"parent\":\"Adapter\"},{\"_id\":\"5c04fc163838b0772dd93454d\",\"Company\":\"TESTCOMPANY\",\"id\":\"test_us\",\"parent\":\"\"},{\"_id\":\"5c0518723838b0772dd9636e\",\"Company\":\"TESTCOMPANY\",\"id\":\"Device\",\"parent\":\"test_us\"}]";

        static void Main(string[] args)
        {
            var items =  JsonConvert.DeserializeObject<List<Item>>(jsonString);

            var dictionary = new Dictionary<string, Item>();

            foreach (var item in items)
            {
                if (!dictionary.ContainsKey(item.Parent))
                {   
                    dictionary.Add(item.Id, item);
                }
                else
                {
                    if (dictionary[item.Parent].Children == null)
                        dictionary[item.Parent].Children = new List<Item>();
                    dictionary[item.Parent].Children.Add(item);
                }
            }

            string json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);

            System.Console.WriteLine(json);

            System.Console.ReadLine();
        }
    }
}

我刚刚制作了一个使用 Newtonsoft.Json 库的简单控制台应用程序。我认为它最常用于此类目的。

您必须自己找到如何在结果中删除父属性,但我想这应该没什么大不了的。


推荐阅读