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;elsereturn 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;elsereturn 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

转载于:https://www.cnblogs.com/ly77461/p/5719057.html

用c#写一个json的万能解析器相关推荐

  1. java json帮助类_java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈"per_page"是一个json对象,我们可以根据"per_page"来找到对应值是3,而第二个红圈&quo ...

  2. erlang xml 解析_用yecc(erlang)写一个json解析器

    昨天写了个json的解析器.其实yecc早看过了,只是那时对自己要求太高,想一下子写个小语言.然后大脑就陷入混乱... 后来注意力转移了.就不那么急着去开发些难道大的.今天回来一看,觉得都理解了,实践 ...

  3. 手写一个JSON反序列化程序

    上一篇文章<JSON是什么>给大家介绍了JSON的标准规范,今天就自己动手写一个JSON的反序列化程序,并命名它为 zjson. 0 开始之前 本篇文章的目的是学习实践,所以我们选择相对简 ...

  4. 用 Go 手写一个 JSON 序列化器

    用 Go 手写一个 JSON 序列化器 方案 实现 字符串转义 忽略类型 序列化器主体 数字和逻辑类型 字符串类型 数组类型 字典类型 自定义结构类型 指针类型 API 使用 安装 调用 测试 开源和 ...

  5. TOOL 一个裴蜀定理解析器

    刚才随便写了一个裴蜀定理解析器,主要功能有: 计算两个整数的最大公因数 抛出非法输入(两个都是0) 计算裴蜀方程的解(ta+sb=gcd(a,b)ta+sb=gcd(a,b)ta+sb=gcd(a,b ...

  6. 用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

    一.前言 在用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐. 在用Qt写一个简单的音乐播放器(二):增加界面(开始和 ...

  7. 用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐

    一.前言 QMediaplayer可以用于解析音频文件和视频文件,继承自QMediaObject,涉及到的对象为QMediaContent.QMediaObject可以提供关于媒体内容的接入,通过UR ...

  8. 网页html解析工具,一个犀利的 HTML 解析器 —— Less.Html

    一个犀利的 HTML 解析器 -- Less.Html 我写了这个解析器之后才知道,原来 C# 写的 html 解析器有很多.但是因为我没有参照别人的做法,Less.Html 有一个特点,就是它的用法 ...

  9. boost::spirit模块实现一个雇员结构的解析器的测试程序

    boost::spirit模块实现一个雇员结构的解析器的测试程序 实现功能 C++实现代码 实现功能 boost::spirit模块实现一个雇员结构的解析器的测试程序 C++实现代码 #include ...

最新文章

  1. python修改文件内容_Python批量修改文本文件内容的方法详解
  2. Google Test(GTest)使用方法和源码解析——预处理技术分析和应用
  3. No module named cv2
  4. 解决listview中的textview设置了setMovementMethod导致onItemclick无效的问题
  5. 脚手架 - props
  6. AlexNet原理和实现
  7. nginx访问本地目录一直不好使_Nginx跳转本地目录容易犯的错误
  8. 帝国cms7.0调用指定栏目,指定顺序排列
  9. QT每日一练day21:鼠标事件
  10. Java自动化测试框架-06 - 来给你的测试报告化个妆整个形 - (下)(详细教程)
  11. [Python] 学习资料汇总
  12. Android: app不被系统kill掉
  13. TMS320C55x的硬件结构
  14. 【OpenCV入门教程之二】 一览众山小:OpenCV 2.4.8 or OpenCV 2.4.9组件结构全解析(转)...
  15. 罗技 GHUB驱动的官方下载网址
  16. ESP8266WiFi模块资料整理
  17. AHU 数据结构 最短路径 安大地图版本
  18. poj3182(bfs)
  19. (3)数仓建设-数据仓库设计方案
  20. C++经典算法题-最大访客数

热门文章

  1. php 笔试题doc,php笔试试题.doc
  2. Maven 下载net.sf.json-lib jar包
  3. 台式机怎样用无线网卡
  4. 交通违法行为代码含义
  5. tikz 折线 箭头_Latex在图形里加箭头 Latex通过Tpx添加箭头
  6. springboot整合webmagic动态爬取网页
  7. HTML+CSS个人主页设计 (大二期末网页作业)
  8. NCS8803 功能:是一颗将HDMI信号转EDP信号的转接芯片。其应用如下:
  9. 国内所有的图床都在这了!!
  10. 削履适足-途牛旅游网敏捷开发流程再造