using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ryCommon; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; namespace 开发辅助工具.Tools { public partial class FrmJson : DockContent { public FrmJson() { InitializeComponent(); BtnSave.Visible = false; toolStripSeparator1.Visible = false; } private void LoadTreeList(TreeNodeCollection nodes,JObject jo) { foreach (var item in jo) { if (item.Value.HasValues) { var node = nodes.Add(item.Key.ToString()); node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() }; try { JArray jar = JArray.Parse(item.Value.ToString()); if (jar != null) { for (int i = 0; i < jar.Count; i++) { var node1 = node.Nodes.Add(i.ToString()); node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() }; node.ImageKey = "array"; node.SelectedImageKey = "array"; LoadTreeList(node1.Nodes, (JObject)JsonConvert.DeserializeObject(jar[i].ToString())); //TreeNode new_child = new TreeNode(); //new_child.Text = jar[i].ToString(); //node.Nodes.Add(new_child); } } } catch(Exception) { LoadTreeList(node.Nodes, (JObject)JsonConvert.DeserializeObject(item.Value.ToString())); } //JArray jar = JArray.Parse(item.Value.ToString()); //if (jar.Count != 0) { //for (int i = 0; i < jar.Count; i++) //{ // TreeNode new_child = new TreeNode(); // new_child.Text = jar[i].ToString(); // nodes.Add(new_child); //} } } else { var node = nodes.Add(item.ToString()); node.Tag = new JsonInfo() { name = item.Key.ToString(), value = item.Value.ToString() }; } } } public void Format(string text) { string json_text = text; treeView1.Nodes.Clear(); var max_nodes_count = 0; //if (Manager.Json.IsJson(json_text)) { try { highlightEditor1.SetHightlightText(Manager.Json.ConvertJsonString(json_text),"json"); highlightEditor1.Refresh(); JObject jo = null; if (Manager.Json.IsArray(json_text)) { var node2 = treeView1.Nodes.Add("0"); node2.Tag = new JsonInfo() { name = "0", value = "", JsonType= JTokenType.Array }; node2.ImageKey = "array"; node2.SelectedImageKey = "array"; JArray jar = JArray.Parse(json_text); ScanArray(node2.Nodes, jar); } else { jo = (JObject)JsonConvert.DeserializeObject(json_text); Scan(treeView1.Nodes, jo); } void Scan(TreeNodeCollection nodes, JObject _jo) { IEnumerable properties = _jo.Properties(); foreach (JProperty item in properties) { if (item.Value.Type == JTokenType.Array) { var node2 = nodes.Add(item.Name); node2.Tag = new JsonInfo() { Property = item, name = item.Name, value = item.Value.ToString(), JsonType= JTokenType.Array }; node2.ImageKey = "array"; node2.SelectedImageKey = "array"; JArray jar = JArray.Parse(item.Value.ToString()); ScanArray(node2.Nodes, jar); } else if (item.Value.Type == JTokenType.Object) { var node2 = nodes.Add(item.Name); var tag_json= new JsonInfo() { Property = item, name = item.Name, value = item.Value.ToString(), JsonType = JTokenType.Object }; node2.Tag = tag_json; node2.ImageKey = node2.SelectedImageKey= tag_json.ImageKey; Scan(node2.Nodes, (JObject)JsonConvert.DeserializeObject(item.Value.ToString())); } else { var node = nodes.Add(item.Name + ":" + item.Value + "|" + item.Value.Type.ToString()); var tag_json = new JsonInfo() { Property = item, name = item.Name, value = item.Value.ToString(), JsonType = item.Value.Type }; node.Tag = tag_json; node.ImageKey = node.SelectedImageKey = tag_json.ImageKey; } //Console.WriteLine(item.Name + ":" + item.Value); } if(nodes.Count> max_nodes_count && treeView1.Nodes!= nodes) { max_nodes_count = nodes.Count; } //var values = _jo.Values(); //foreach (var item in values) //{ // var va = item.Value().Children.Children(); // var node = nodes.Add(item.ToString()); // //if(item.HasValues) // //Scan(node.Nodes,(JObject)JsonConvert.DeserializeObject(item.ToString())); //} } void ScanArray(TreeNodeCollection nodes, JArray jar) { if (jar != null) { for (int i = 0; i < jar.Count; i++) { var node3 = nodes.Add(i.ToString()); node3.Tag = new JsonInfo() { name = i.ToString(), value = "", JsonType = JTokenType.Array }; node3.ImageKey = "array"; node3.SelectedImageKey= "array"; if (jar[i].Type == JTokenType.Object) { Scan(node3.Nodes, (JObject)jar[i]); } else { node3.Nodes.Add(jar[i].ToString()).Tag = new JsonInfo() {IsNoValue=true, Property = new JProperty(jar[i].ToString(),null), name = jar[i].ToString(), value = "", JsonType = jar[i].Type }; } } if (nodes.Count > max_nodes_count && treeView1.Nodes != nodes) { max_nodes_count = nodes.Count; } } } //if (Manager.Json.IsArray(json_text)) //{ // JArray jar = JArray.Parse(json_text); // if (jar != null) // { // for (int i = 0; i < jar.Count; i++) // { // var node1 = treeView1.Nodes.Add(i.ToString()); // LoadTreeList(node1.Nodes, (JObject)JsonConvert.DeserializeObject(jar[i].ToString())); // //TreeNode new_child = new TreeNode(); // //new_child.Text = jar[i].ToString(); // //node.Nodes.Add(new_child); // } // } //} //else //{ // jo = (JObject)JsonConvert.DeserializeObject(json_text); //} //LoadTreeList(treeView1.Nodes,jo); //for (int i = 0; i < jo.Count; i++) //{ // treeView1.Nodes.Add(jo..ToString()); //} } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Information); } } if (max_nodes_count < 5) { treeView1.ExpandAll(); } else { if (treeView1.Nodes.Count > 0) treeView1.Nodes[0].Expand(); } //else //{ // MessageBox.Show("无效的Json内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); // textEditorControl1.Document.TextContent = json_text; // textEditorControl1.Refresh(); //} } private void BtnFormat_Click(object sender, EventArgs e) { Format(highlightEditor1.Text); } public void LoadJson(string json_text) { highlightEditor1.SetHightlightText(json_text,"json"); highlightEditor1.Refresh(); BtnFormat.PerformClick(); } private void 复制键名ToolStripMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode == null) { return; } JsonInfo item = (JsonInfo)treeView1.SelectedNode.Tag; if(item == null ) { return; } ryCommon.RyFiles.CopyToClip(item.name); } private void 复制键值ToolStripMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode == null) { return; } if (treeView1.SelectedNode.Tag == null) { return; } JsonInfo item = (JsonInfo)treeView1.SelectedNode.Tag; ryCommon.RyFiles.CopyToClip(item.value); } private void BtnPasteJson_Click(object sender, EventArgs e) { Format(Clipboard.GetText()); } private void BtnCopyJson_Click(object sender, EventArgs e) { ryCommon.RyFiles.CopyToClip(highlightEditor1.Text); } private void FrmJson_Load(object sender, EventArgs e) { foreach (JTokenType day in Enum.GetValues(typeof(JTokenType))) { CbbType.Items.Add(day); } CbbType.SelectedIndex = 0; } private void TreeView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right)//判断你点的是不是右键 { Point ClickPoint = new Point(e.X, e.Y); TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint); if (CurrentNode != null)//判断你点的是不是一个节点 { treeView1.SelectedNode = CurrentNode;//选中这个节点 } } } private void 展开ToolStripMenuItem_Click(object sender, EventArgs e) { treeView1.ExpandAll(); } private void 折叠ToolStripMenuItem_Click(object sender, EventArgs e) { treeView1.CollapseAll(); } private void CopyJsonByCHS_Click(object sender, EventArgs e) { try { JObject jo = (JObject)JsonConvert.DeserializeObject(highlightEditor1.Text); var aa = Newtonsoft.Json.JsonConvert.SerializeObject(jo, new Newtonsoft.Json.JsonSerializerSettings() { StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeNonAscii }); ryCommon.RyFiles.CopyToClip(aa); } catch(Exception ex) { MessageBox.Show(ex.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if(e.Node==null) { CbbType.SelectedIndex = 0; TxtName.Text = ""; TxtValue.Text = ""; BtnApply.Enabled = false; return; } var item = (JsonInfo)e.Node.Tag; if (item == null) { BtnApply.Enabled = false; return; } CbbType.SelectedItem = item.JsonType; TxtName.Text = item.name; TxtValue.Text = item.value; if(item.JsonType== JTokenType.Object || item.JsonType== JTokenType.Array) { BtnApply.Enabled = false; } else { BtnApply.Enabled = true; } } private void ConvertTreeToJson() { JArray jarr= new JArray(); JObject jo = new JObject(); jo=Scan(treeView1.Nodes); if (treeView1.Nodes.Count == 1 && treeView1.Nodes[0].Tag is JsonInfo ji2 && ji2.JsonType == JTokenType.Array && ji2.name == "0") { highlightEditor1.Text = jo.GetJsonValue("0",""); } else { highlightEditor1.Text = jo.ToString(); } JObject Scan(TreeNodeCollection nodes) { var jo_result=new JObject(); for (int i = 0; i < nodes.Count; i++) { var item = (JsonInfo)nodes[i].Tag; switch (item.JsonType) { case JTokenType.Array: var kk = ScanArray(nodes[i].Nodes); jo_result.Add(item.name,kk); break; case JTokenType.Object: jo_result.Add(new JProperty(item.name, Scan(nodes[i].Nodes))); break; case JTokenType.Integer: jo_result.Add(item.Property.Name,item.Property.Value.ToInt64()); break; case JTokenType.Boolean: jo_result.Add(item.Property.Name, item.Property.Value.ToBool()); break; case JTokenType.Float: jo_result.Add(item.Property.Name, item.Property.Value.ToDouble()); break; case JTokenType.Date: jo_result.Add(item.Property.Name, item.Property.Value.ToDateTime()); break; case JTokenType.String: jo_result.Add(item.Property.Name, item.Property.Value.ToString()); break; case JTokenType.Null: jo_result.Add(item.Property.Name,null); break; default: jo_result.Add(item.Property); break; } } return jo_result; } JArray ScanArray(TreeNodeCollection nodes) { JArray jarr_result = new JArray(); for (int i = 0; i < nodes.Count; i++) { var item = (JsonInfo)nodes[i].Tag; switch (item.JsonType) { case JTokenType.Array: if (item.Property == null) { if (nodes[i].Nodes[0].Tag is JsonInfo ji && ji.IsNoValue) { switch(ji.JsonType) { case JTokenType.Integer: jarr_result.Add(ji.Property.Name.ToInt64()); break; case JTokenType.Boolean: jarr_result.Add(ji.Property.Name.ToBool()); break; case JTokenType.Float: jarr_result.Add(ji.Property.Name.ToDouble()); break; default: jarr_result.Add(ji.Property.Name); break; } } else jarr_result.Add(Scan(nodes[i].Nodes)); } else { //jarr_result.Add(Scan(nodes[i].Nodes)); } break; case JTokenType.Object: break; default: if (item.IsNoValue) { jarr_result.Add(item.Property.Name); } else { jarr_result.Add(new JObject(item.Property)); } break; } } return jarr_result; } } private void BtnApply_Click(object sender, EventArgs e) { var node = treeView1.SelectedNode; if (node == null) { return; } var item = (JsonInfo)node.Tag; if (item.Property == null) { return; } if(item.IsNoValue && TxtValue.Text.Length>0) { item.IsNoValue = false; } switch(item.JsonType) { case JTokenType.Array: MessageBox.Show("不支持修改Array", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; case JTokenType.Object: MessageBox.Show("不支持修改Object", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; case JTokenType.Float: item.Property.Value = TxtValue.Text.ToDouble(); break; case JTokenType.Boolean: item.Property.Value = TxtValue.Text.ToBool(); break; case JTokenType.Integer: item.Property.Value = TxtValue.Text.ToInt64(); break; case JTokenType.Date: item.Property.Value = TxtValue.Text.ToDateTime(); break; case JTokenType.Null: if (TxtValue.Text.Length > 0) { if (TxtValue.Text.IsInt()) { item.Property.Value = TxtValue.Text.ToInt64(); item.JsonType = JTokenType.Integer; } else if (TxtValue.Text.IsDouble()) { item.Property.Value = TxtValue.Text.ToDouble(); item.JsonType = JTokenType.Float; } else if (TxtValue.Text.IsBool()) { item.Property.Value = TxtValue.Text.ToBool(); item.JsonType = JTokenType.Boolean; } else { item.Property.Value = TxtValue.Text; item.JsonType = JTokenType.String; } } else { //item.Property.Value = TxtValue.Text.ToDateTime(); } break; default: item.Property.Value = TxtValue.Text; break; } item.value = TxtValue.Text; node.Text = item.ToString(); ConvertTreeToJson(); } private void BtnSave_Click(object sender, EventArgs e) { DialogResult = DialogResult.OK; } } public enum JsonType { JArray=0, JObject=1, String=2, Int=3, Double=4 } public class JsonInfo { public string name = ""; public string value = ""; public bool IsNoValue = false; public JProperty Property = null; public JTokenType JsonType = JTokenType.None; public override string ToString() { if(JsonType== JTokenType.Array || JsonType== JTokenType.Object) { return name; } else { return name + ":" + value + "|" + JsonType.ToString(); } } public string ImageKey { get { switch(JsonType) { case JTokenType.String: return "string"; case JTokenType.Integer: return "int"; case JTokenType.Float: return "float"; case JTokenType.Array: return "array"; } return "normal"; } } } }