关于将JSON数据转换为C#Winforms TreeView的一些问题
首先,我在Stackoverflow上阅读了大量关于JSON到TreeView的主题。在此之后,我创建了一个JSON数据,如下所示:关于将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
{
"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的代码是不正确的。您可以检查此链接,该链接与缩进的目的相同。您是否尝试过此代码?