.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?
//获取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,代码如下:
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了。看看下面的方法:
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
.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator的更多相关文章
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...
- .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来
从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- .NET平台开源项目速览(1)SharpConfig配置文件读写组件
在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...
- .NET平台开源项目速览(12)哈希算法集合类库HashLib
.NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...
- .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...
- .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)
在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...
- .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...
随机推荐
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- Apache Ignite之集群应用测试
集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- ifconfig: command not found(CentOS专版,其他的可以参考)
ifconfig: command not found 查看path配置(echo相当于c中的printf,C#中的Console.WriteLine) echo $PATH 解决方案1:先看看是不是 ...
- 隐马尔科夫模型python实现简单拼音输入法
在网上看到一篇关于隐马尔科夫模型的介绍,觉得简直不能再神奇,又在网上找到大神的一篇关于如何用隐马尔可夫模型实现中文拼音输入的博客,无奈大神没给可以运行的代码,只能纯手动网上找到了结巴分词的词库,根据此 ...
- SQL Server常见数据类型介绍
数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...
- 自己实现一个javascript事件模块
nodejs中的事件模块 nodejs中有一个events模块,用来给别的函数对象提供绑定事件.触发事件的能力.这个别的函数的对象,我把它叫做事件宿主对象(非权威叫法),其原理是把宿主函数的原型链指向 ...
- java 利用ManagementFactory获取jvm,os的一些信息--转
原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...
- ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录
环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...
- 代码的坏味道(15)——冗余类(Lazy Class)
坏味道--冗余类(Lazy Class) 特征 理解和维护类总是费时费力的.如果一个类不值得你花费精力,它就应该被删除. 问题原因 也许一个类的初始设计是一个功能完全的类,然而随着代码的变迁,变得没什 ...