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