У меня есть дерево winforms, я могу читать данные автоматически (узел, равный ключу, и узел внутри которого равен значению), но при чтении типа объекта, значения внутри него не будут дочерними узлами объекта (ключом объекта), (может быть, я не мог хорошо объяснить, вот скриншот и мои методы.)Как рекурсивно заполнять TreeView с данными JSON
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. Любая помощь? (Извините за язык ошибок)
Может быть, [этот поток] (http://stackoverflow.com/questions/16181298/how-to-do-recursive-descent-of-json-using-json-net) может помочь? –
Я постараюсь, когда смогу :) (я не могу попробовать сейчас) Но .. я не понимаю, что здесь делает walknode. Не могли бы вы объяснить, пожалуйста? –
'WalkNode' работает следующим образом: получает узел из аргумента, затем выполняет итерацию по каждому дочернему узлу узла. Он применяет функцию «Действие» (которая может быть добавлена к MainNode в вашем случае), а затем идет уровень глубже - calss 'WalkNode' на дочернем элементе. В принципе, он рекурсивно ходит по всем узлам в JSON. –