SuperDesign/Source/开发辅助工具/Tools/FrmJson.cs
zilinsoft 993f1ca1a9 ### 2024-12-20 星期五更新
------
#### SuperDesign    V3.0.2412.2001
- *.[新增]新增程序更新日志设置和自动发布功能。
- *.[修复]修复Post数据格式不正确时双击文本框会导致软件闪退的BUG。
2024-12-20 08:15:19 +08:00

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";
}
}
}
}