------ #### SuperDesign V3.0.2412.2001 - *.[新增]新增程序更新日志设置和自动发布功能。 - *.[修复]修复Post数据格式不正确时双击文本框会导致软件闪退的BUG。
537 lines
23 KiB
C#
537 lines
23 KiB
C#
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<JProperty> 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<JProperty>();
|
|
//foreach (var item in values)
|
|
//{
|
|
// var va = item.Value<JProperty>().Children.Children<JProperty>();
|
|
// 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";
|
|
}
|
|
}
|
|
}
|
|
}
|