DynamicallycreateatreeviewfromjsontextinWinforms我正在构建一个从外部源获取运行时JSON消息的应用程序。我对消息文本的结构一无所知。我想获取此JSON文本,将其呈现为树视图(或类似的,关于UI),在我刚刚动态创建的树视图中编辑此JSON,然后将文本发送回源。我真的不知道从哪里开始……有什么建议吗?JObjectobj=JObject.Parse(json);tvw_display.Nodes.Clear();TreeNodeparent=Json2Tree(obj);parent.Text="根对象";tvw_display.Nodes.Add(parent);}catch(Exceptionex){MessageBox.Show(ex.Message,"ERROR");}}privateTreeNodeJson2Tree(JObjectobj){//创建父节点TreeNodeparent=newTreeNode();//遍历obj。alltokenshouldbepairforeach(vartokeninobj){//更改父级的显示内容parent.Text=token.Key.ToString();//创建子节点TreeNodechild=newTreeNode();child.Text=token.Key.ToString();//检查值是否为obj类型调用方法if(token.Value.Type.ToString()=="Object"){//child.Text=token.Key.ToString();//使用Token.valueJObject创建一个新的JObjecto=(JObject)token.Value;//回忆我thodchild=Json2Tree(o);//将孩子添加到父节点parent.Nodes.Add(child);}//如果类型是数组elseif(token.Value.Type.ToString()=="Array"){intix=-1;//child.Text=token.Key.ToString();//遍历数组foreach(varitmintoken.Value){//检查值是否为对象数组if(itm.Type.ToString()=="Object"){TreeNodeobjTN=newTreeNode();//child.Text=token.Key.ToString();//回调方法ix++;JObjecto=(JObject)itm;objTN=Json2Tree(o);objTN.Text=token.Key.ToString()+"["+ix+"]";child.Nodes.Add(objTN);//parent.Nodes.Add(child);}//常规数组字符串、整数等elseif(itm.Type.ToString()=="Array"){ix++;TreeNodedataArray=newTreeNode();foreach(itm中的var数据){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{//如果有en.Value没有嵌套//child.Text=token.Key.ToString();//如果value==null或空字符串,则将值更改为N/Aif(token.Value.ToString()=="")child.Nodes.Add("N/A");否则child.Nodes.Add(token.Value.ToString());parent.Nodes.Add(孩子);}}返回父级;}示例json{“firstName”:“John”,“lastName”:“Smith”,“isAlive”:true,“age”:25,“height_cm”:167.6,“address”:{“streetAddress”:“212ndStreet","city":"NewYork","state":"NY","postalCode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212555-1234"},{"type":"office","number":"646555-4567"}],"children":[],"spouse":null}注:本例使用NewtonSoftJson对单击解决方案,然后单击“管理NuGet包”以安装引用。此代码将处理JArray或JObject作为输入:stringjsonString="yourjsonstringhere";stringrootName="root",nodeName="node";J容器json;尝试{如果(jsonString.StartsWith("[")){json=JArray.Parse(jsonString);treeView1.Nodes.Add(Utilities.Json2Tree((JArray)json,rootName,nodeName));}else{json=JObject.Parse(jsonString);treeView1.Nodes.Add(Utilities.Json2Tree((JObject)json,text));}}catch(JsonReaderExceptionjre){MessageBox.Show("无效的Json。");}publicclassUtilities{publicstaticTreeNodeJson2Tree(JArrayroot,stringrootName="",stringnodeName=""){TreeNodeparent=newTreeNode(rootName);整数索引=0;foreach(JTokenobjinroot){TreeNodechild=newTreeNode(string.Format("{0}[{1}]",nodeName,index++));foreach(KeyValuePairtokenin(JObject)obj){switch(token.Value.Type){caseJTokenType.Array:caseJTokenType.Object:child.Nodes.Add(Json2Tree((JObject)token.Value,token.Key));休息;默认值:child.Nodes.Add(GetChild(代币));休息;}}parent.Nodes.Add(child);}返回父级;}publicstaticTreeNodeJson2Tree(JObjectroot,stringtext=""){TreeNodeparent=newTreeNode(text);foreach(根中的KeyValuePair令牌){switch(token.Value.Type){caseJTokenType.Object:parent.Nodes.Add(Json2Tree((JObject)token.Value,token.Key));休息;caseJTokenType.Array:intindex=0;foreach((JArray)token.Value中的JToken元素){parent.Nodes.Add(Json2Tree((JObject)element,string.Format("{0}[{1}]",token.Key,index++)));}if(index==0)parent.Nodes.Add(string.Format("{0}[]",token.Key));//处理空数组break;默认值:parent.Nodes.Add(GetChild(token));休息;}}返回父级;}privatestaticTreeNodeGetChild(KeyValuePairtoken){TreeNodechild=newTreeNode(token.Key);child.Nodes.Add(string.IsNullOrEmpty(token.Value.ToString())?"n/a":token.Value.ToString());归还孩子;那里有很多问题,真的,如果你真的需要每个部分的指导,这里有很多尝试和回答。有读取JSON结构的类,随时可用。由于Yosi间接链接,有JSON.net一旦您可以读取JSON,就可以使用它来构建TreeView编辑很容易,因为TreeView具有支持就地编辑的LabelEdit属性。从那里开始,只需对其做出反应并跟踪更改即可。或者,您可以选择最后一口气读完所有内容。无论哪种方式,TreeView都有BeforeLabelEdit、AfterLabelEdit等事件,所有这些都可以在上面的TreeView链接上找到。可以试试这段代码:以上是C#学习教程:在Winforms中根据json文本动态创建树视图分享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassJsonTag{publicJsonTag(JsonReaderreader){TokenType=reader.TokenType;价值=读者。价值;ValueType=reader.ValueType;}publicJsonTokenTokenType{get;放;}公共对象值{得到;放;}publicTypeValueType{get;放;}}privatevoidJsonToTreeview(stringjson){tvwValue.BeginUpdate();varparentText=string.Empty;TreeNodeCollectionparentNodes=tvwValue.Nodes;TreeNodecurrent=null;reader=newJsonTextReader(newStringReader(json));while(reader.Read()){switch(reader.TokenType){caseJsonToken.None:break;caseJsonToken.StartObject:current=newTreeNode("{}"){Tag=newJsonTag(reader)};parentNodes.Add(当前);parentNodes=current.Nodes;休息;caseJsonToken.StartArray:current=newTreeNode("[]"){Tag=newJsonTag(reader)};parentNodes.Add(当前);如果(当前nt.PrevNode!=null){if(((JsonTag)current.PrevNode.Tag).TokenType==JsonToken.PropertyName)current.Parent.Text+="[]";parentText=current.Parent.Text;如果(current.Parent.Parent.Text.Length>2)parentText=","+parentText;current.Parent.Parent.Text=current.Parent.Parent.Text.Insert(current.Parent.Parent.Text.Length-1,parentText);}parentNodes=current.Nodes;休息;案例JsonToken.StartConstructor:中断;caseJsonToken.PropertyName:current=newTreeNode("""+reader.Value+"":");parentNodes.Add(当前);if(current.PrevNode!=null)current.PrevNode.Text+=",";parentNodes=current.Nodes;current=newTreeNode(reader.Value.ToString()){Tag=newJsonTag(reader)};parentNodes.Add(当前);休息;caseJsonToken.Comment:break;案例JsonToken.Raw:中断;案例JsonToken.Date:案例JsonToken.Integer:案例JsonToken.Float:案例JsonToken.Boolean:案例JsonToken.String:varreaderValue="";if(reader.TokenType==JsonToken.String)readerValue="""+reader.Value+""";elsereaderValue=reader.Value.ToString();current=newTreeNode(readerValue){Tag=newJsonTag(reader)};parentNodes.Add(当前);current.Parent.Text+=readerValue;parentText=current.Parent.Text;如果(current.Parent.Parent.Text.Length>2)parentText=","+parentText;current.Parent.Parent.Text=current.Parent.Parent.Text.Insert(current.Parent.Parent.Text.Length-1,parentText);如果(((JsonTag)current.PrevNode.Tag).TokenType==JsonToken.PropertyName)current=current.Parent;当前=当前.父级;parentNodes=current.Nodes;休息;案例JsonToken.Bytes:中断;案例JsonToken.Null:中断;案例JsonToken.Undefined:break;caseJsonToken.EndObject:if(current.FirstNode.Tag!=null&&((JsonTag)current.FirstNode.Tag).TokenType==JsonToken.PropertyName)current=current.Parent;当前=当前.父级;if(current==null)parentNodes=tvwValue.Nodes;否则父节点=当前节点;休息;caseJsonToken.EndArray:if(((JsonTag)current.PrevNode.Tag).TokenType==JsonToken.PropertyName)current=current.Parent;当前=当前.父级;if(current==null)parentNodes=tvwValue.Nodes;elseparentNodes=current.Nodes;休息;案例JsonToken.EndConstructor:中断;默认值:抛出新的ArgumentOutOfRangeException();}}tvwValue.EndUpdate();侵权请点击维权联系管理员删除如需转载请注明出处:
