【基于ListView控件的JSON编辑器】

基于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;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值