【发布时间】:2017-02-02 02:01:04
【问题描述】:
我有一个winforms treeview,我可以自动读取数据,(一个节点等于key,一个节点里面等于value),但是读取对象类型时,里面的值不会是对象节点的子节点(对象的键),(可能我解释不好,这里是截图和我的方法。)
layer0 需要在纹理内部,比例需要在显示内部
我的 Json:
{
"parent": "builtin/generated",
"textures": {
"layer0": "mm:items/iron_dust"
},
"display": {
"scale": [ 1.7, 1.7, 1.7 ]
}
}
我的自动检测方法(实际上并非都是我的)
private void Form1_Load(object sender, EventArgs e)
{
StreamReader reader = new StreamReader(path);
string json = reader.ReadToEnd();
reader.Close();
JObject obj = JObject.Parse(json);
getAllProperties(obj);
}
void getAllProperties(JToken children)
{
TreeNode mainNode = treeView1.Nodes[0];
mainNode.Text = Path.GetFileNameWithoutExtension(path);
foreach (JToken child in children.Children())
{
var property = child as JProperty;
if (property != null)
{
if (property.Value.Type == JTokenType.String)
{
TreeNode keyNode = mainNode.Nodes.Add(property.Name);
keyNode.Nodes.Add(property.Value.ToString());
}
if (property.Value.Type == JTokenType.Array)
{
JArray array = (JArray)property.Value;
TreeNode node = mainNode.Nodes.Add(property.Name);
for (int i = 0; i < array.Count; i++)
{
node.Nodes.Add(array[i].ToString());
}
}
if (property.Value.Type == JTokenType.Object)
{
TreeNode topNode = mainNode.Nodes.Add(property.Name.ToString());
foreach (var item in property)
{
if (item.Type == JTokenType.String)
{
if (property.Value.Type == JTokenType.String)
{
TreeNode keyNode = topNode.Nodes.Add(property.Name);
keyNode.Nodes.Add(property.Value.ToString());
}
if (property.Value.Type == JTokenType.Array)
{
JArray array = (JArray)property.Value;
TreeNode node = topNode.Nodes.Add(property.Name);
for (int i = 0; i < array.Count; i++)
{
node.Nodes.Add(array[i].ToString());
}
}
}
}
}
// Console.WriteLine(property.Name + ":" + property.Value);//print all of the values
}
getAllProperties(child);
}
}
}
我尝试获取父级,但它没有名称和值属性:S。 有什么帮助吗? (语言错误见谅)
【问题讨论】:
-
也许this thread 能帮上忙?
-
我会尽可能尝试:)(我现在不能尝试)但是..我不明白 walknode 在这里做什么。你能解释一下吗?
-
WalkNode的工作方式如下:从参数中获取节点,然后遍历节点的每个子节点。它应用Action函数(在您的情况下可以添加到 MainNode 中),然后更深入 - 在子节点上调用WalkNode。基本上,它递归遍历 JSON 中的所有节点。 -
你可以复制你在
foreach循环中的逻辑(你在这里访问你的TreeNode的mainNode,对吧?)并将它插入Action函数中,在WalkNode中引用 -
可能是的,但我不能确定,因为我没有尝试使用你的代码,也没有自己用这种方式解析 JSON。
标签: c# json winforms treeview parent-child