2016-09-24 23 views
3

私はwinformsツリービューを持っています。データを自動的に読み取ることができます(キーと等しいノードと値の等しいノード)その中の値はオブジェクトノード(オブジェクトのキー)の子になることはありません(おそらく、私はうまく説明できませんでした、スクリーンショットとメソッドです)。TreeViewに再帰的にJSONデータを設定する方法

layer0はテクスチャとスケールが必要ですディスプレイ内部の

layer0 needs to be inside textures and scale needs to be inside display

マイ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); 
      } 
     } 

    } 

検出私は親を取得しようとしましたが、それは名前と値の特性を有するdidntは:Sを。 助けてください? (言語のミスのため申し訳ありませんが)

+1

private void Form1_Load(object sender, EventArgs e) { using (var reader = new StreamReader(path)) using (var jsonReader = new JsonTextReader(reader)) { var root = JToken.Load(jsonReader); DisplayTreeView(root, Path.GetFileNameWithoutExtension(path)); } } private void DisplayTreeView(JToken root, string rootName) { treeView1.BeginUpdate(); try { treeView1.Nodes.Clear(); var tNode = treeView1.Nodes[treeView1.Nodes.Add(new TreeNode(rootName))]; tNode.Tag = root; AddNode(root, tNode); treeView1.ExpandAll(); } finally { treeView1.EndUpdate(); } } private void AddNode(JToken token, TreeNode inTreeNode) { if (token == null) return; if (token is JValue) { var childNode = inTreeNode.Nodes[inTreeNode.Nodes.Add(new TreeNode(token.ToString()))]; childNode.Tag = token; } else if (token is JObject) { var obj = (JObject)token; foreach (var property in obj.Properties()) { var childNode = inTreeNode.Nodes[inTreeNode.Nodes.Add(new TreeNode(property.Name))]; childNode.Tag = property; AddNode(property.Value, childNode); } } else if (token is JArray) { var array = (JArray)token; for (int i = 0; i < array.Count; i++) { var childNode = inTreeNode.Nodes[inTreeNode.Nodes.Add(new TreeNode(i.ToString()))]; childNode.Tag = array[i]; AddNode(array[i], childNode); } } else { Debug.WriteLine(string.Format("{0} not implemented", token.Type)); // JConstructor, JRaw } } 

をあなたは次のツリービュー構造を取得します/ how-to-do-recursive-descent-of-json-using-json-net)は役に立ちますか? –

+0

私はできるときに私は試してみる:)(私は今それを試すことはできません)しかし..私はwalknodeここで何を理解していません。どうか説明していただけますか? –

+1

'WalkNode'は次のように動作します:ノードを引数から取得し、ノードのすべての子を反復処理します。これは 'Action'関数(あなたのケースではMainNodeに追加することができます)を適用してから、レベルを深くして、子に対して' WalkNode'を呼び出します。基本的には、JSON内のすべてのノードを再帰的に処理します。 –

答えて

5
問題は、あなたが再帰的に JToken階層を下ると、あなたもではなく、作成したばかりの親ノードに子ノードを追加し、再帰的に作成している TreeNode階層を下降する必要がある、ということです

ルートノードには、Recursion, parsing xml file with attributes into treeview c#の行に沿って表示されます。

あなたが行う場合はこのように:たぶん[このスレッド](http://stackoverflow.com/questions/16181298

enter image description here

+0

Whoa!これは私が必要とするものです。しかし、私は何かが不思議です。これはブーリアンに対して機能しますか?if(token is JBoolean){var childNode = inTreeNode.Nodes [inTreeNode.Nodes.Add(new TreeNode(token.ToString()))]; childNode.Tag = token;} –

+1

「JBoolean」というものはありません。ブール値は 'JValue'に格納されます。すべての具体的なlinq-to-JSONタイプのセットは、[この回答](https://stackoverflow.com/questions/23812357/how-to-bind-dynamic-json-into-treeview-wpf/28097883#28097883)に示されています。 )。 – dbc

関連する問題