Некоторые проблемы с данными JSON в C # Winforms TreeView - PullRequest
0 голосов
/ 23 мая 2018

Во-первых, я прочитал кучу тем о JSON в TreeView в Stackoverflow.После этого я создаю данные JSON следующим образом:

{
    "Cars": {
            "Audi": [{
                "A6 2.0 TDI quatro 2018 Red": ["S-Line", "17 inch rim", "Full sport packet"],
                "A5 1.6 TFSI 2018 Blue": ["Desing packet", "Sunroof"]
            }],
            "Mercedes-Benz": [{
                "E220d AMG 2018 white": ["Glass ceiling", "Vacuum doors", "Navigation"],
                "E220d Exclusive Black 2018 Blue": ["Power seats", "Start & Stop"]
            }]
        }
}

Вот содержимое кода C #:

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        treeView1.Nodes.Clear();
        var json = File.ReadAllText(Uz.path + @"cars.json");
        var obj = JObject.Parse(json);
        var parent = Json2Tree(obj);
        treeView1.Nodes.Add(parent);
        treeView1.ExpandAll();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, @"ERROR");
    }
}
private static TreeNode Json2Tree(JObject obj)
{
    //create the parent node
    var parent = new TreeNode();
    //loop through the obj. all token should be pair<key, value>
    foreach (var token in obj)
    {
        //change the display Content of the parent
        parent.Text = token.Key;
        //create the child node
        var child = new TreeNode();
        child.Text = token.Key;
        //check if the value is of type obj recall the method
        if (token.Value.Type.ToString() == "Object")
        {
            // child.Text = token.Key.ToString();
            //create a new JObject using the the Token.value
            var o = (JObject)token.Value;
            //recall the method
            child = Json2Tree(o);
            //add the child to the parentNode
            parent.Nodes.Add(child);
        }
        //if type is of array
        else if (token.Value.Type.ToString() == "Array")
        {
            int ix = -1;
            //  child.Text = token.Key.ToString();
            //loop though the array
            foreach (var itm in token.Value)
            {
                //check if value is an Array of objects
                if (itm.Type.ToString() == "Object")
                {
                    //child.Text = token.Key.ToString();
                    //call back the method
                    ix++;

                    var o = (JObject)itm;
                    var objTN = Json2Tree(o);
                    //objTN.Text = token.Key + "[" + ix + "]";
                    child.Nodes.Add(objTN);
                    //parent.Nodes.Add(child);
                }
                //regular array string, int, etc
                else if (itm.Type.ToString() == "Array")
                {
                    ix++;
                    var dataArray = new TreeNode();
                    foreach (var data in itm)
                    {
                        //dataArray.Text = token.Key + "[" + ix + "]";
                        dataArray.Nodes.Add(data.ToString());
                    }
                    child.Nodes.Add(dataArray);
                }
                else
                {
                    child.Nodes.Add(itm.ToString());
                }
            }
            parent.Nodes.Add(child);
        }
        else
        {
            //if token.Value is not nested
            // child.Text = token.Key.ToString();
            //change the value into N/A if value == null or an empty string 
            child.Nodes.Add(token.Value.ToString() == "" ? "N/A" : token.Value.ToString());
            parent.Nodes.Add(child);
        }
    }
    return parent;
}

, когда я запускаю код, снимок экрана выглядит следующим образом:

enter image description here

Но помеченные как 1, 2 и 3 не должны отображаться.Должно быть так: enter image description here

Хотя я работал 3 дня, у меня ничего не получилось.

1 Ответ

0 голосов
/ 27 мая 2018

В JsonTreeView проект выглядит следующим образом:

using System.Windows.Forms;
using Newtonsoft.Json.Linq;

namespace JsonTreeView
{
    public static class JsonToTreeView
    {
        public static void Json2Tree(this TreeView treeView, string json, string group_name)
        {
            if (string.IsNullOrWhiteSpace(json))
            {
                return;
            }
            var obj = JObject.Parse(json);
            AddObjectNodes(obj, group_name, treeView.Nodes);
        }

        public static void AddObjectNodes(JObject obj, string name, TreeNodeCollection parent)
        {
            var node = new TreeNode(name);
            parent.Add(node);

            foreach (var property in obj.Properties())
            {
                AddTokenNodes(property.Value, property.Name, node.Nodes);
            }
        }

        private static void AddArrayNodes(JArray array, string name, TreeNodeCollection parent)
        {
            var node = new TreeNode(name);
            parent.Add(node);

            for (var i = 0; i < array.Count; i++)
            {
                AddTokenNodes(array[i], $"[{i}]", node.Nodes);
            }
        }

        private static void AddTokenNodes(JToken token, string name, TreeNodeCollection parent)
        {
            switch (token)
            {
                case JValue _:
                    parent.Add(new TreeNode($"{((JValue) token).Value}"));
                    break;
                case JArray _:
                    AddArrayNodes((JArray)token, name, parent);
                    break;
                case JObject _:
                    AddObjectNodes((JObject)token, name, parent);
                    break;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...