我正在构建一个从外部源获取运行时JSON消息的应用程序。
我对消息文本的结构一无所知。
我想获取此JSON文本,将其呈现到树视图(或等效的UI),在我刚刚动态创建的树视图中编辑此JSON,然后将文本发送回源。
我真的不知道从哪里开始。有什么建议吗?
private void btn_Convert_MouseClick(object sender, MouseEventArgs e) { try { string json = rbt_display.Text; JObject obj = JObject.Parse(json); tvw_display.Nodes.Clear(); TreeNode parent = Json2Tree(obj); parent.Text = "Root Object"; tvw_display.Nodes.Add(parent); } catch (Exception ex) { MessageBox.Show(ex.Message, "ERROR"); } } private TreeNode Json2Tree(JObject obj) { //create the parent node TreeNode 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.ToString(); //create the child node TreeNode child = new TreeNode(); child.Text = token.Key.ToString(); //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 JObject 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") { TreeNode objTN = new TreeNode(); //child.Text = token.Key.ToString(); //call back the method ix++; JObject o = (JObject)itm; objTN = Json2Tree(o); objTN.Text = token.Key.ToString() + "[" + ix + "]"; child.Nodes.Add(objTN); //parent.Nodes.Add(child); } //regular array string, int, etc else if(itm.Type.ToString() == "Array") { ix++; TreeNode dataArray = new TreeNode(); foreach (var data in itm) { dataArray.Text = token.Key.ToString() + "[" + 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 if (token.Value.ToString() == "") child.Nodes.Add("N/A"); else child.Nodes.Add(token.Value.ToString()); parent.Nodes.Add(child); } } return parent; } sample json { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 25, "height_cm": 167.6, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" } ], "children": [], "spouse": null }
注意:此示例使用NewtonSoft Json。右键单击解决方案,然后单击管理NuGet软件包以安装参考。