JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序
JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序
.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析。但随着业务的变化,也会碰到超级变态的JSON,如果还按照以前的思路,会把人搞抽风掉,一旦结构变化,又要重来。所以今天给大家介绍一个简单的方法,轻轻松松搞定超级变态的JSON,虽然需要生成实体类。它就是开源的:JSON C# Class Generator组件。
.NET开源目录:【目录】本博客其他.NET开源项目文章目录
本文原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_json_generator.html
1.复杂的JSON啥样子?
看看下面这个图,文本文件都是12K,嵌套多层,说实话,我是没耐心看下去的。所以找了个工具结构化了一下。看图对比:


2.使用JSON C# Class Generator介绍和使用
JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序。项目地址:https://jsonclassgenerator.codeplex.com/ ,目前支持数组,对象,整形,单精度,布尔,字符串和空值符类型。
使用过程很简单,如下图官网的截图所示:输入命名空间,主类名,生成的cs文件目录,以及类型即可。同时右边还有可见性,和一些简单的配置,简单易懂。

下面看看我们演示的这个JSON的使用,是在网络找到的一段演示JSON代码,我自己用到的实际数据有些比这还复杂。首先我们把JSON复制到JSON C# Class Generator中,设置相关参数,如下图所示,生成文件后,复制到项目中,下面我们可以写测试代码,看看起解析的格式:

说明一下,我们JSON反序列需要用到Newtonsoft组件,这个相信大部分都肯定比我熟悉。将生成的文件复制到项目中,并添加的引用,如下代码就反序列化OK了。是不是So Easy?
|
1
2
3
4
|
//获取jsonzifc var json = File.ReadAllText("复杂JSON例子.txt");//使用Newtonsoft反序列化var model = JsonConvert.DeserializeObject<TestJson>(json); |
其实这个套路大部分人也都懂,但我知道的也有一些在线解析工具,但貌似遇到特别复杂的,不好整,这个工具是我见过的里面比较简单易用。看看解析的数据,结构化后,非常清晰,自己想要那个数据,自己去属性依次获取就好了。

3.就这么完了?No,没那么简单
工具能解决的问题一般不是全部,能解决8成就很不错了,虽然这个工具刚开始就解决了很多问题,但随着JSON的复杂化,也碰到了一些坑,看看如何填坑。现在已经是填坑专业户了。
3.1 为什么要使用嵌套类(nested classes)
为什么在对于复杂的类型我选择使用嵌套类,原因很简单,结构更清晰,否则生成的cs文件里面一堆类,都搞不清楚那个是最外面的,对这种需求,适当的代码冗余就无所谓了,我需要的是快速的拿到自己想要的数据。何况是自动生成的。当然对于简单的类型,不使用嵌套类也是可以的,看个人习惯吧。
3.2 解析会碰到类型名称为数字的字段
虽然比较奇葩,但的确是遇到了,获取的JSON字符串里面的字段名称为数字,怎么破?鬼知道人家这么拼出来的,反正是为了采集,还得有解药才行。既然原始的是数字,那就把原始的给改了,我们把属性是数字的地方,都给加一个默认值,然后生成实体类,不就可以了,不过想在这么一堆乱七八糟的东西里面把所有的数字属性加个默认值,也不容易啊,还好有万能的正则表达式。
我们写一个简单的正则表达式匹配方法,把数字属性统一替换为前面加个默认的字母A,代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public static string GetNewJson(String json){ Regex reg = new Regex("\"([^\"]d*)\":"); //注意里面的引号 要用双引号表示,而不是用反斜杠 MatchEvaluator matchEval = new MatchEvaluator(ReplaceStar); return reg.Replace(json, matchEval);}static string ReplaceStar(Match match){ string str = match.Value.Replace("\"", "").Replace(":", ""); return "\"A" + str + "\":";} |
3.3 相同结构的,但解析为不同的类名
很多时候某个属性下面有多个相同结构的对象,但是会根据名称解析为不同的类,结构基本一直,在获取对象数据的时候,又不是数组对象,循环还不好搞,那怎么破?
手动建一个中间类,结构和他们一样,使用TinyMaper,这里有文章介绍,将这些类型默认都映射到这个中间类中,然后其他各个相同结构对象的解析只需要写一份代码就OK了。看看下面的方法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class LineRato{ public string LgMailNo; public string CreateTime; public string EventTime; public string EventAddress; public string NodeType; public string Timeout; /// <summary>将其他结构相同的类转换为中间类</summary> public static LineRato GetLine<T>(T model) { TinyMapper.Bind<T, LineRato>(); return TinyMapper.Map<LineRato>(model); }} |
3.4 空值导致实体类字段缺失
某些时候我们在第一次获取JSON值的时候,由于某些值是空的,导致实际的JSON值里面没包括该字段,所以在生成的时候实体类里面肯定没有这个字段,而实际多次后发现某些情况下该值又不为空,会导致解析失败,这个时候怎么破?
没办法破了,为了省事,看看是那里缺少字段,手动加上吧,就一行代码的事情。
总之,在解决了80%问题后,剩下的方法比问题多多了,大家各显神通吧。这里只是吧自己的解决过程写下来,最快的解决问题,OK!其他费脑细胞的事情还是给有精力的人!
4.资源
本文代码:JsonClassTest.rar
JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序的更多相关文章
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
- JSON C# Class Generator ---由json字符串生成C#实体类的工具(转)
转载地址:http://www.cnblogs.com/finesite/archive/2011/07/31/2122984.html json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但 ...
- 【从零开始】用node搭建一个jsonp&json服务
目录: 一.介绍 二.node安装 三.webstorm配置node环境 四.代码介绍 五.如何使用 六.自定义域名 七.其他 一.介绍 1.背景 日常工作中,跟后端商定好接口格式后:通常采用 ...
- 『练手』手写一个独立Json算法 JsonHelper
背景: > 一直使用 Newtonsoft.Json.dll 也算挺稳定的. > 但这个框架也挺闹心的: > 1.影响编译失败:https://www.cnblogs.com/zih ...
- JSON C# Class Generator ---由json字符串生成C#实体类的工具
json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的J ...
- Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
先把代码贴上来,有时间整理一下 首先说一下要实现的功能: 假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如: [ { "id": "NEW20170 ...
- 未能加载文件或程序集“Newtonsoft.Json”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
"/"应用程序中的服务器错误. 未能加载文件或程序集"Newtonsoft.Json"或它的某一个依赖项.找到的程序集清单定义与程序集引用不匹配. (异常来自 ...
- Java中对象JSON格式化处理时的一个坑
在项目中遇到了一个JSON的坑.记录下. 直接上代码: import java.util.ArrayList; import com.alibaba.fastjson.JSON; public cla ...
- TypeToken 是google提供的一个解析Json数据的类库中一个类
Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Type是java里的reflect包的Type ...
随机推荐
- Anisotropic gauss filter
最近一直在做版面分析,其中文本行检测方面,许多文章涉及到了Anigauss也就是各向异性高斯滤波. 顾名思义,简单的理解就是参数不同的二维高斯滤波. 在文章Fast Anisotropic Gauss ...
- Linq to BBJECT之非延时标准查询操作符
非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用. 1.ToArray操作符 ToArray操作符用于将一个输入序列转换成一个数组. 方法原型: ...
- Activity切换效果(overridePendingTransition)
在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...
- 深入浅出Node.js (8) - 构建Web应用
8.1 基础功能 8.1.1 请求方法 8.1.2 路径解析 8.1.3 查询字符串 8.1.4 Cookie 8.1.5 Session 8.1.6 缓存 8.1.7 Basic认证 8.2 数据上 ...
- 【转】使用DateFormat把时间长度格式化为"时:分:秒"格式--不错
原文网址:http://ssd910.blog.163.com/blog/static/238767972010112214114201/ 经常在系统中显示时间长度,基本上每次都是显示秒数,客户觉得按 ...
- 2015第19周四jquery版本
今天用到一个jquery插件,发现最新版需要jquery2.0以上版本才行,而目前项目在用的版本是1.8.3,自然无法使用,刚看了jquery的主要版本和差异,直接百度搜索无满意结果,最后在百科中给出 ...
- bzoj4003
http://www.lydsy.com/JudgeOnline/problem.php?id=4003 可合并堆. 每个点都有一个小根堆,记住可以到这个点的骑士有哪些,以战斗力为关键字. 从底层到顶 ...
- js如何获取object类型里的键值
最近遇到一个问题: var obj = {"name1":"张三","name2":"李四"}; var key = & ...
- MySQL查询当前数据上一条和下一条的记录
如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): ) [and other_cond ...
- PHP设计模式笔记八:原型模式 -- Rango韩老师 http://www.imooc.com/learn/236
原型模式 概述: 1.与工厂模式作用类似,都是用来创建对象 2.与工厂模式的实现不同,原型模式是先创建好一个原型对象,然后通过clone原型对象来创建新的对象,这样就免去了类创建时重复的初始化操作 3 ...