基于ListView控件的JSON编辑器
初步实现了JSON的加载和修改功能。增加和删除还需要大家来完善。希望可以帮助到到有需要的人。
public static class SerializeExtension
{
/// <summary>
/// 对象是空
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsNull(this object obj)
{
return obj == null;
}
/// <summary>
/// 对象不为空
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsNotNull(this object obj)
{
return obj != null;
}
#region 空判断
public static bool IsNullOrEmpty(this string inputStr)
{
return string.IsNullOrEmpty(inputStr);
}
public static bool IsNullOrWhiteSpace(this string inputStr)
{
return string.IsNullOrWhiteSpace(inputStr);
}
public static string Format(this string inputStr, params object[] obj)
{
return string.Format(inputStr, obj);
}
#endregion
//判断字符串是否为纯数字
public static bool IsNumber(this object obj)
{
string str = obj.ToString();
if (str == null || str.Length == 0) //验证这个参数是否为空
return false; //是,就返回False
ASCIIEncoding ascii = new ASCIIEncoding();//new ASCIIEncoding 的实例
byte[] bytestr = ascii.GetBytes(str); //把string类型的参数保存到数组里
foreach (byte c in bytestr) //遍历这个数组里的内容
{
if (c < 48 || c > 57) //判断是否为数字
{
return false; //不是,就返回False
}
}
return true; //是,就返回True
}
#region JSON序列化
/// <summary>
/// 实体对象转字符串
/// </summary>
/// <param name="obj"></param>
/// <param name="ignoreNull"></param>
/// <returns></returns>
public static string ToJson(this object obj, bool ignoreNull = false)
{
if (obj.IsNull())
return null;
return JsonConvert.SerializeObject(obj, Formatting.None, new JsonSerializerSettings
{
DateFormatString = "yyyy-MM-dd HH:mm:ss",
NullValueHandling = ignoreNull ? NullValueHandling.Ignore : NullValueHandling.Include
});
}
/// <summary>
/// 实体对象转字符串(首字母小写)
/// </summary>
/// <param name="obj"></param>
/// <param name="ignoreNull"></param>
/// <returns></returns>
public static string ToJsonLowercase(this object obj, bool ignoreNull = false)
{
if (obj.IsNull())
return null;
return JsonConvert.SerializeObject(obj, Formatting.None, new JsonSerializerSettings
{
DateFormatString = "yyyy-MM-dd HH:mm:ss",
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(),
NullValueHandling = ignoreNull ? NullValueHandling.Ignore : NullValueHandling.Include
});
}
/// <summary>
/// JSON字符串转实体对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="jsonStr"></param>
/// <returns></returns>
public static T FromJson<T>(this string jsonStr)
{
return jsonStr.IsNullOrEmpty() ? default(T) : JsonConvert.DeserializeObject<T>(jsonStr, new JsonSerializerSettings
{
DateFormatString = "yyyy-MM-dd HH:mm:ss"
});
}
#endregion
}
class TreeViewJSON : TreeView
{
public JToken dataJSON;
public TreeViewJSON()
{
}
public string GetTreeJSON()
{
return dataJSON.ToJson();
}
public void BindTreeView()
{
dataJSON = dataJSON ?? new JObject();
BindTreeView(dataJSON.ToJson());
}
public void BindTreeView(JObject jo)
{
jo = jo ?? new JObject();
BindTreeView(jo.ToJson());
}
public void BindTreeView(string strJson)
{
Nodes.Clear();//清空Node
if (strJson.IsNullOrEmpty()) return;
if (IsJOjbect(strJson))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(strJson);
foreach (var joitem in jo)
{
TreeNode jotree;
if (joitem.Value.GetType() == typeof(JValue))
{
jotree = new TreeNode(joitem.Key + ":" + joitem.Value.ToString());
jotree.Tag = joitem.Key;
Nodes.Add(jotree);
}
else
{
jotree = new TreeNode(joitem.Key);
jotree.Tag = joitem.Key;
AddTreeChildNode(ref jotree, joitem.Value.ToString());
Nodes.Add(jotree);
}
}
ExpandAll();
return;
}
else if(IsJArray(strJson))
{
JArray ja = (JArray)JsonConvert.DeserializeObject(strJson);
int index = 0;
foreach (var item in ja)
{
if (item.GetType() == typeof(JObject))
{
JObject jo = item.ToObject<JObject>();
TreeNode tree = new TreeNode();
foreach (var jaitem in jo)
{
TreeNode jatree;
if (jaitem.Value.GetType() == typeof(JValue))
{
jatree = new TreeNode(jaitem.Key + ":" + jaitem.Value.ToString());
jatree.Tag = index + "," + jaitem.Key;
tree.Nodes.Add(jatree);
}
else
{
jatree = new TreeNode(jaitem.Key);
jatree.Tag = index + "," + jaitem.Key;
AddTreeChildNode(ref jatree, jaitem.Value.ToString());
tree.Nodes.Add(jatree);
}
}
Nodes.Add(tree);
}
else if (item.GetType() == typeof(JArray))
{
JArray jsona = item.ToObject<JArray>();
TreeNode tree = new TreeNode();
int j = 0;
foreach (var jaitem in jsona)
{
TreeNode jatree;
jatree = new TreeNode();
jatree.Tag = index + "," + j;
AddTreeChildNode(ref jatree, jaitem.ToJson());
tree.Nodes.Add(jatree);
j++;
}
Nodes.Add(tree);
}
else if (item.GetType() == typeof(JValue))
{
TreeNode tree = new TreeNode(item.ToString());
Nodes.Add(tree);
}
index++;
}
}
else
{
TreeNode jotree = new TreeNode(strJson);
Nodes.Add(jotree);
}
ExpandAll();
}
public void AddTreeChildNode(ref TreeNode parantNode, string value)
{
if (IsJOjbect(value))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(value);
foreach (var joitem in jo)
{
TreeNode jotree;
if(joitem.Value.GetType() == typeof(JValue))
{
jotree = new TreeNode(joitem.Key + ":" + joitem.Value.ToString());
jotree.Tag = parantNode.Tag + "," + joitem.Key;
parantNode.Nodes.Add(jotree);
}
else
{
jotree = new TreeNode(joitem.Key);
jotree.Tag = parantNode.Tag + "," + joitem.Key;
AddTreeChildNode(ref jotree, joitem.Value.ToString());
parantNode.Nodes.Add(jotree);
}
}
return;
}
if (IsJArray(value))
{
JArray ja = (JArray)JsonConvert.DeserializeObject(value);
int index = 0;
foreach (var item in ja)
{
if (item.GetType() == typeof(JObject))
{
TreeNode tree = new TreeNode();
parantNode.Nodes.Add(tree);
JObject jo = item.ToObject<JObject>();
foreach (var jaitem in jo)
{
TreeNode jatree;
if (jaitem.Value.GetType() == typeof(JValue))
{
jatree = new TreeNode(jaitem.Key + ":" + jaitem.Value.ToString());
jatree.Tag = parantNode.Tag + "," + index + "," + jaitem.Key;
tree.Nodes.Add(jatree);
}
else
{
jatree = new TreeNode(jaitem.Key);
jatree.Tag = parantNode.Tag + "," + index + "," + jaitem.Key;
AddTreeChildNode(ref jatree, jaitem.Value.ToString());
tree.Nodes.Add(jatree);
}
}
}
else if (item.GetType() == typeof(JArray))
{
TreeNode tree = new TreeNode();
parantNode.Nodes.Add(tree);
JArray jsona = item.ToObject<JArray>();
int j = 0;
foreach (var jaitem in jsona)
{
TreeNode jatree;
jatree = new TreeNode();
jatree.Tag = parantNode.Tag + "," + index + "," + j;
AddTreeChildNode(ref jatree, jaitem.ToJson());
tree.Nodes.Add(jatree);
j++;
}
}
else if (item.GetType() == typeof(JValue))
{
TreeNode jatree = new TreeNode(item.ToString());
parantNode.Nodes.Add(jatree);
}
index++;
}
}
}
public void RefreshTree()
{
BindTreeView();
if (Nodes.Count == 0) return;
Focus();
SelectedNode = Nodes[0];
}
private List<object> GetJSONPaths()
{
SelectedNode.Tag = SelectedNode.Tag ?? "";
if (SelectedNode.Tag.ToString().IsNullOrEmpty()) return new List<object>();
string[] sArray = SelectedNode.Tag.ToString().Split(',');
List<object> oArray = new List<object>();
foreach (string item in sArray)
{
object o = item.IsNumber() ? int.Parse(item) : (object)item;
oArray.Add(o);
}
return oArray;
}
private List<object> GetJSONPaths(TreeNode jotree)
{
jotree.Tag = jotree.Tag ?? "";
if (jotree.Tag.ToString().IsNullOrEmpty()) return new List<object>();
string[] sArray = jotree.Tag.ToString().Split(',');
List<object> oArray = new List<object>();
foreach (string item in sArray)
{
object o = item.IsNumber() ? int.Parse(item) : (object)item;
oArray.Add(o);
}
return oArray;
}
public string GetJSON()
{
List<object> oArray = GetJSONPaths();
if (oArray.Count == 0) return "";
JToken jt = dataJSON;
foreach (var item in oArray)
{
jt = jt[item];
}
return jt.IsNull()?"": jt.ToJson();
}
public string GetParentJSON()
{
List<object> oArray = GetJSONPaths();
if (oArray.Count == 0) return "";
JToken jt = dataJSON;
for (int i= 0; i< oArray.Count-1;i++)
{
jt = jt[oArray[i]];
}
return jt.IsNull() ? "" : jt.ToJson();
}
public void SetJSON(string value)
{
List<object> oArray = GetJSONPaths();
if (oArray.Count == 0) return;
switch (oArray.Count)
{
case 1:
if (IsJOjbect(value)) dataJSON[oArray[0]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]] = JArray.Parse(value);
else
dataJSON[oArray[0]] = value;
break;
case 2:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]] = value;
break;
case 3:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]] = value;
break;
case 4:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]] = value;
break;
case 5:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]] = value;
break;
case 6:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]] = JArray.Parse(value);
else
dataJSON[oArray[5]] = value;
break;
case 7:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]] = value;
break;
case 8:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]] = value;
break;
case 9:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]] = value;
break;
case 10:
if (IsJOjbect(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]][oArray[9]] = JObject.Parse(value);
else
if (IsJArray(value)) dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]][oArray[9]] = JArray.Parse(value);
else
dataJSON[oArray[0]][oArray[1]][oArray[2]][oArray[3]][oArray[4]][oArray[5]][oArray[6]][oArray[7]][oArray[8]][oArray[9]] = value;
break;
default:
break;
}
return;
}
public string GetText()
{
List<object> oArray = GetJSONPaths();
if (oArray.Count == 0) return "";
JToken jt = dataJSON;
foreach (var item in oArray)
{
jt = jt[item];
}
if (jt.GetType() == typeof(JValue)) return jt.ToString();
return "";
}
public bool IsJOjbect(string value)
{
try
{
JObject ja = JObject.Parse(value);
return true;
}
catch (Exception)
{
return false;
}
}
public bool IsJArray(string value)
{
try
{
JArray ja = JArray.Parse(value);
return true;
}
catch (Exception)
{
return false;
}
}
}