json解析类

来源:互联网 发布:mac文件夹无故消失 编辑:程序博客网 时间:2024/04/19 22:43
public class JsonModelAnalyzer    {        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;        }    }

public class JsonModel : JsonModelAnalyzer    {        private string rawjson;        private bool isValue = false;        private bool isModel = false;        private bool isCollection = false;        internal JsonModel(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;            }        }        private string Rawjson        {            get { return rawjson; }        }        private bool IsValue()        {            return isValue;        }        private bool IsValue(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                JsonModel model = new JsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    JsonModel submodel = new JsonModel(model.Value);                    return submodel.IsValue();                }            }            return false;        }        private bool IsModel()        {            return isModel;        }        private bool IsModel(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                JsonModel model = new JsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    JsonModel submodel = new JsonModel(model.Value);                    return submodel.IsModel();                }            }            return false;        }        private bool IsCollection()        {            return isCollection;        }        private bool IsCollection(string key)        {            if (!isModel)                return false;            if (string.IsNullOrEmpty(key))                return false;            foreach (string subjson in base._GetCollection(this.rawjson))            {                JsonModel model = new JsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    JsonModel submodel = new JsonModel(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 JsonModel(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))            {                JsonModel model = new JsonModel(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 JsonModel GetModel(string key)        {            if (!isModel)                return null;            if (string.IsNullOrEmpty(key))                return null;            foreach (string subjson in base._GetCollection(this.rawjson))            {                JsonModel model = new JsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    JsonModel submodel = new JsonModel(model.Value);                    if (!submodel.IsModel())                        return null;                    else                        return submodel;                }            }            return null;        }        /// <summary>        /// 模型是对象,key对应是集合,返回集合        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public JsonModel GetCollection(string key)        {            if (!isModel)                return null;            if (string.IsNullOrEmpty(key))                return null;            foreach (string subjson in base._GetCollection(this.rawjson))            {                JsonModel model = new JsonModel(subjson);                if (!model.IsValue())                    continue;                if (model.Key == key)                {                    JsonModel submodel = new JsonModel(model.Value);                    if (!submodel.IsCollection())                        return null;                    else                        return submodel;                }            }            return null;        }        /// <summary>        /// 模型是集合,返回自身        /// </summary>        /// <returns></returns>        public List<JsonModel> GetCollection()        {            List<JsonModel> list = new List<JsonModel>();            if (IsValue())                return list;            foreach (string subjson in base._GetCollection(rawjson))            {                list.Add(new JsonModel(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);            }        }    }

class Program    {        static void Main(string[] args)        {            string json = "{\"total\":0}";            string json2 = "{\"total\":0,\"data\":{\"377149574\" : 1}} ";            string json3 = "{\"total\":0,\"data\":{\"377149574\":[{\"cid\":\"377149574\"}]}}";            JsonModel model = new JsonModel(json);            JsonModel model2 = new JsonModel(json2);            JsonModel model3 = new JsonModel(json3);            string aa= model.GetValue("total"); // return 0            string aa2 = model2.GetModel("data").GetValue("377149574"); //return 1            string aa3 = model3.GetModel("data").GetCollection("377149574").GetCollection()[0].GetValue("cid"); //return 377149574        }            }
原创粉丝点击