Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于将JSON数据转换为C#Winforms TreeView的一些问题_C#_Json_Winforms_Json.net_Treeview - Fatal编程技术网

关于将JSON数据转换为C#Winforms TreeView的一些问题

关于将JSON数据转换为C#Winforms TreeView的一些问题,c#,json,winforms,json.net,treeview,C#,Json,Winforms,Json.net,Treeview,首先,我在Stackoverflow上阅读了大量关于JSON到TreeView的主题。在此之后,我创建了一个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

首先,我在Stackoverflow上阅读了大量关于JSON到TreeView的主题。在此之后,我创建了一个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"]
            }]
        }
}
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;
            }
        }
    }
}
以下是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;
}
private void Form1\u加载(对象发送方,事件参数e)
{
尝试
{
treeView1.Nodes.Clear();
var json=File.ReadAllText(Uz.path+@“cars.json”);
var obj=JObject.Parse(json);
var parent=Json2Tree(obj);
treeView1.Nodes.Add(父级);
treeView1.ExpandAll();
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message,@“ERROR”);
}
}
私有静态树节点Json2Tree(JObject obj)
{
//创建父节点
var parent=new TreeNode();
//循环通过obj。所有令牌都应该是成对的
foreach(obj中的var标记)
{
//更改父对象的显示内容
parent.Text=token.Key;
//创建子节点
var child=new TreeNode();
child.Text=token.Key;
//检查该值是否为obj类型并调用该方法
if(token.Value.Type.ToString()=“Object”)
{
//child.Text=token.Key.ToString();
//使用Token.value创建一个新的JObject
var o=(JObject)token.Value;
//回想一下这个方法
child=Json2Tree(o);
//将子节点添加到父节点
parent.Nodes.Add(子节点);
}
//如果类型为数组
else if(token.Value.Type.ToString()=“数组”)
{
int ix=-1;
//child.Text=token.Key.ToString();
//循环遍历数组
foreach(token.Value中的var itm)
{
//检查值是否为对象数组
if(itm.Type.ToString()=“对象”)
{
//child.Text=token.Key.ToString();
//回调该方法
ix++;
var o=(JObject)itm;
var objTN=Json2Tree(o);
//objTN.Text=token.Key+“[”+ix+“]”;
添加子节点(objTN);
//parent.Nodes.Add(子节点);
}
//规则数组字符串、整型等
else if(itm.Type.ToString()=“数组”)
{
ix++;
var dataArray=new TreeNode();
foreach(itm中的var数据)
{
//dataArray.Text=token.Key+“[”+ix+“]”;
dataArray.Nodes.Add(data.ToString());
}
添加(dataArray);
}
其他的
{
Add(itm.ToString());
}
}
parent.Nodes.Add(子节点);
}
其他的
{
//如果令牌.Value未嵌套
//child.Text=token.Key.ToString();
//如果值==null或空字符串,则将该值更改为N/A
添加(token.Value.ToString()==“”?“N/A”:token.Value.ToString());
parent.Nodes.Add(子节点);
}
}
返回父母;
}
当我运行代码时,屏幕截图如下所示:

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

但标记为1、2和3的不应显示。一定是这样的:

虽然我工作了3天,但没有成功。

在project中,它显示如下:

{
    "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"]
            }]
        }
}
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;
            }
        }
    }
}
使用System.Windows.Forms;
使用Newtonsoft.Json.Linq;
命名空间JsonTreeView
{
公共静态类JsonToTreeView
{
公共静态void Json2Tree(此树视图树视图、字符串json、字符串组名称)
{
if(string.IsNullOrWhiteSpace(json))
{
返回;
}
var obj=JObject.Parse(json);
AddObjectNodes(obj、组名称、treeView.Nodes);
}
公共静态void AddObjectNodes(JObject对象、字符串名称、TreeNodeCollection父节点)
{
var节点=新树节点(名称);
添加(节点);
foreach(obj.Properties()中的var属性)
{
AddTokenNodes(property.Value、property.Name、node.Nodes);
}
}
私有静态void AddArrayNodes(JArray数组、字符串名称、TreeNodeCollection父级)
{
var节点=新树节点(名称);
添加(节点);
对于(var i=0;i
您必须使用该JSON结构吗?我认为您在这方面做得太多了,似乎您用来生成TreeNodeCollection的代码是不正确的。您可以检查此链接,该链接与缩进的目的相同。您是否尝试过此代码?