Как отформатировать строку JSON в формате дерева в C # - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть список данных из базы данных Mongo.Содержание в формате JSON.Это массив объектов, и значения имеют родительские отношения друг с другом. Объект, у которого родитель имеет нулевое значение (""), означает, что это корневой узел.

[  
   {  
      "_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"
     }]
    }
]

я просто хочу отобразить это дерево структуры формата в веб-интерфейсе

1 Ответ

0 голосов
/ 03 декабря 2018

Я не уверен, что это будет достаточно быстро, но это может быть возможным решением:

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.Я думаю, что это в основном используется для таких целей.

Вы должны самостоятельно найти, как удалить родительские свойства в результате, но я полагаю, это не должно иметь большого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...