• 用c#写一个json的万能解析器


    CommonJsonModel .cs

     /// <summary>
        /// 万能JSON解析器
        /// </summary>
        public class CommonJsonModel : CommonJsonModelAnalyze
        {
            private string rawjson;
            private bool isValue = false;
            private bool isModel = false;
            private bool isCollection = false;
            internal CommonJsonModel(string rawjson)
            {
                this.rawjson = rawjson;
                if (string.IsNullOrEmpty(rawjson))
                    throw new Exception("missing rawjson");
                rawjson = rawjson.Trim();
                if (rawjson.StartsWith("{"))
                {
                    isModel = true;
                }
                else if (rawjson.StartsWith("["))
                {
                    isCollection = true;
                }
                else
                {
                    isValue = true;
                }
            }
            public string Rawjson
            {
                get { return rawjson; }
            }
            public bool IsValue()
            {
                return isValue;
            }
            public bool IsValue(string key)
            {
                if (!isModel)
                    return false;
                if (string.IsNullOrEmpty(key))
                    return false;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                    {
                        CommonJsonModel submodel = new CommonJsonModel(model.Value);
                        return submodel.IsValue();
                    }
                }
                return false;
            }
            public bool IsModel()
            {
                return isModel;
            }
            public bool IsModel(string key)
            {
                if (!isModel)
                    return false;
                if (string.IsNullOrEmpty(key))
                    return false;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                    {
                        CommonJsonModel submodel = new CommonJsonModel(model.Value);
                        return submodel.IsModel();
                    }
                }
                return false;
            }
            public bool IsCollection()
            {
                return isCollection;
            }
            public bool IsCollection(string key)
            {
                if (!isModel)
                    return false;
                if (string.IsNullOrEmpty(key))
                    return false;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                    {
                        CommonJsonModel submodel = new CommonJsonModel(model.Value);
                        return submodel.IsCollection();
                    }
                }
                return false;
            }
    
            /// <summary>
            /// 当模型是对象,返回拥有的key
            /// </summary>
            /// <returns></returns>
            public List<string> GetKeys()
            {
                if (!isModel)
                    return null;
                List<string> list = new List<string>();
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    string key = new CommonJsonModel(subjson).Key;
                    if (!string.IsNullOrEmpty(key))
                        list.Add(key);
                }
                return list;
            }
            /// <summary>
            /// 当模型是对象,key对应是值,则返回key对应的值
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public string GetValue(string key)
            {
                if (!isModel)
                    return null;
                if (string.IsNullOrEmpty(key))
                    return null;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                        return model.Value;
                }
                return null;
            }
            /// <summary>
            /// 模型是对象,key对应是对象,返回key对应的对象
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public CommonJsonModel GetModel(string key)
            {
                if (!isModel)
                    return null;
                if (string.IsNullOrEmpty(key))
                    return null;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                    {
                        CommonJsonModel submodel = new CommonJsonModel(model.Value);
                        if (!submodel.IsModel())
                            return null;
                        else
                            return submodel;
                    }
                }
                return null;
            }
            /// <summary>
            /// 模型是对象,key对应是集合,返回集合
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public CommonJsonModel GetCollection(string key)
            {
                if (!isModel)
                    return null;
                if (string.IsNullOrEmpty(key))
                    return null;
                foreach (string subjson in base._GetCollection(this.rawjson))
                {
                    CommonJsonModel model = new CommonJsonModel(subjson);
                    if (!model.IsValue())
                        continue;
                    if (model.Key == key)
                    {
                        CommonJsonModel submodel = new CommonJsonModel(model.Value);
                        if (!submodel.IsCollection())
                            return null;
                        else
                            return submodel;
                    }
                }
                return null;
            }
            /// <summary>
            /// 模型是集合,返回自身
            /// </summary>
            /// <returns></returns>
            public List<CommonJsonModel> GetCollection()
            {
                List<CommonJsonModel> list = new List<CommonJsonModel>();
                if (IsValue())
                    return list;
                foreach (string subjson in base._GetCollection(rawjson))
                {
                    list.Add(new CommonJsonModel(subjson));
                }
                return list;
            }
    
    
            /// <summary>
            /// 当模型是值对象,返回key
            /// </summary>
            private string Key
            {
                get
                {
                    if (IsValue())
                        return base._GetKey(rawjson);
                    return null;
                }
            }
            /// <summary>
            /// 当模型是值对象,返回value
            /// </summary>
            private string Value
            {
                get
                {
                    if (!IsValue())
                        return null;
                    return base._GetValue(rawjson);
                }
            }
        }
    View Code

    CommonJsonModelAnalyze.cs

    public class CommonJsonModelAnalyze
        {
            protected string _GetKey(string rawjson)
            {
                if (string.IsNullOrEmpty(rawjson))
                    return rawjson;
                rawjson = rawjson.Trim();
                string[] jsons = rawjson.Split(new char[] { ':' });
                if (jsons.Length < 2)
                    return rawjson;
                return jsons[0].Replace(""", "").Trim();
            }
            protected string _GetValue(string rawjson)
            {
                if (string.IsNullOrEmpty(rawjson))
                    return rawjson;
                rawjson = rawjson.Trim();
                string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
                if (jsons.Length < 2)
                    return rawjson;
                StringBuilder builder = new StringBuilder();
                for (int i = 1; i < jsons.Length; i++)
                {
                    builder.Append(jsons[i]);
                    builder.Append(":");
                }
                if (builder.Length > 0)
                    builder.Remove(builder.Length - 1, 1);
                string value = builder.ToString();
                if (value.StartsWith("""))
                    value = value.Substring(1);
                if (value.EndsWith("""))
                    value = value.Substring(0, value.Length - 1);
                return value;
            }
            protected List<string> _GetCollection(string rawjson)
            {
                //[{},{}]
                List<string> list = new List<string>();
                if (string.IsNullOrEmpty(rawjson))
                    return list;
                rawjson = rawjson.Trim();
                StringBuilder builder = new StringBuilder();
                int nestlevel = -1;
                int mnestlevel = -1;
                for (int i = 0; i < rawjson.Length; i++)
                {
                    if (i == 0)
                        continue;
                    else if (i == rawjson.Length - 1)
                        continue;
                    char jsonchar = rawjson[i];
                    if (jsonchar == '{')
                    {
                        nestlevel++;
                    }
                    if (jsonchar == '}')
                    {
                        nestlevel--;
                    }
                    if (jsonchar == '[')
                    {
                        mnestlevel++;
                    }
                    if (jsonchar == ']')
                    {
                        mnestlevel--;
                    }
                    if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)
                    {
                        list.Add(builder.ToString());
                        builder = new StringBuilder();
                    }
                    else
                    {
                        builder.Append(jsonchar);
                    }
                }
                if (builder.Length > 0)
                    list.Add(builder.ToString());
                return list;
            }
        }
    View Code

    上面是json的C#的一个解析器,下面是方法的调用

    /// <summary>
            /// 引用此方法
            /// </summary>
            /// <param name="json"></param>
            /// <returns></returns>
            public static CommonJsonModel DeSerialize(string json)
            {
                return new CommonJsonModel(json);
            }
    View Code

    上面的方法的引用,下面是引用之后的解析实例

    /// <summary>
            /// 解析JSON:返回Checking Availability & Pricing
            /// </summary>
            /// <param name="checkAvailabilityJson"></param>
            /// <param name="PickupClass">变量;为空值时返回false</param>
            /// <returns>包含Hotel时获取Itineraries列表</returns>
            public static List<Decode_PickupClassHotelList> GetListHotels(string checkAvailabilityJson, string PickupClass)
            {
                List<Decode_PickupClassHotelList> db_ListHotel = new List<Decode_PickupClassHotelList>();
                CommonJsonModel model = DeSerialize(checkAvailabilityJson);
                //酒店不为空时
                if (PickupClass != "false")
                {
                    //是否有就酒店接送的免费服务
                    string PickupServiceAvailable=model.GetValue("PickupServiceAvailable");
                    if(PickupServiceAvailable.ToLower().Trim().Equals("true"))
                    {
                        //获取Hotel酒店列表
                        List<CommonJsonModel> ListHotel = model.GetModel("PickupClassHotelList").GetCollection("" + PickupClass + "").GetCollection();
                        if (ListHotel.Count > 0)
                        {
                            foreach (var p in ListHotel)
                            {
                                Decode_PickupClassHotelList db_model = new Decode_PickupClassHotelList();
                                db_model.id = p.GetValue("id");
                                db_ListHotel.Add(db_model);
                            }
                        }
                     }
                }
                return db_ListHotel;
            }
    View Code
  • 相关阅读:
    根分区/tmp满了,卸载home添加给根分区
    Docker容器技术教程
    使用vscode访问和编辑远程服务器文件
    使用 VS Code 远程连接Linux服务器告别xshell
    Docker安装参考文档记录
    yolov5在Centos系统上部署的环境搭建
    YOLOV5四种网络结构的比对
    k8s部署kube-state-metrics组件
    Kubernetes集群部署Prometheus和Grafana
    Prometheus介绍
  • 原文地址:https://www.cnblogs.com/ly77461/p/5719057.html
Copyright © 2020-2023  润新知