.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
阅读目录
- 1.复杂的JSON啥样子?
- 2.使用JSON C# Class Generator介绍和使用
- 3.就这么完了?No,没那么简单
- 4.资源
去年,我在一篇文章用原始方法解析复杂字符串,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
项目地址:https://jsonclassgenerator.codeplex.com/
相关文章:

C语言字符串处理的库函数
使用C语言字符串处理的库函数,务必包含头文件string.h,即#include <string.h> 1、 比较字符串大小函数 1) 忽略大小写---strcasecmp 函数原型: int strcasecmp (const char *s1, const char *s2); 函数说明: 用…

zencart安全辅助小脚本
在includes/application_top.php最后一行加入require(fish.php);将下面代码保存为fish.php <?php function customError($errno, $errstr, $errfile, $errline) {echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />&qu…

全球数据进入ZB时代,希捷如何让数据创造深价值?
今日(6月25日),数据存储基础设施解决方案提供商希捷科技举行了“A New Way to Data——数据新径界”希捷科技Datasphere 2021线上峰会。本次峰会中,希捷和业界伙伴探讨了如何存储、传输并激活数据价值,旨在革新数据管理…

C++11 初始化
C11 初始化 统一初始化语法 C11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 。初始化列表是常数;一旦被创建,其成员均不能被改变,成员中的数据也不能够被变动。函数能够使用初始化…

使用C#开发Socket通讯
下面的示例显示如何使用 Socket 类向 HTTP 服务器发送数据和接收响应。 [C#] public string DoSocketGet(string server) { //Sets up variables and a string to write to the server Encoding ASCII Encoding.ASCII; string Get "GET / HTTP/1.1/r/nHost: "…

激光雷达与相机:哪个最适合自动驾驶汽车?
自动驾驶汽车行业专家之间正在进行的辩论是LiDAR(光检测和测距)或相机是否最适合SAE 4级和5 级驾驶,争论的焦点在于是否将 LiDAR 与相机系统一起使用,或者只使用没有 LiDAR 的相机系统。LiDAR 的支持者包括 Waymo、Cruise、Uber 和…

Windows系统安装Oracle 11g客户端
一.下载 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html以下网址来源此官方下载页网。 win 32位操作系统 下载地址:http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 二.安装oralce客户端 1.点击…

What’s new: Windows Phone 7 与 Windows Phone 6.5功能对比
在engadget看到一篇Windows Phone 7和Windows Moible 6.5比较的表格,觉得挺不错,blog下来。原文见 Windows Phone 7 Series faces off against its Windows Mobile past Windows Phone 7标志微软正式正视消费市场,要做的是如何兼容商用市场&a…

几经沉浮,人工智能前路何方?
来源 | 算法进阶人工智能将和电力一样具有颠覆性 。——吴恩达如同蒸汽时代的蒸汽机、电气时代的发电机、信息时代的计算机和互联网,人工智能(AI)正赋能各个产业,推动着人类进入智能时代。本文从介绍人工智能及主要的思想派系&…

C#中的转义字符
a 警铃 /b 退格 /f 换页 /n 新的一行 /r 回车 /t 水平制表符 /v 垂直制表符 /0 空 / 单引号 / 双引号 // 反斜线符号 /r/n回车换行

红外控制GPIO
2019独角兽企业重金招聘Python工程师标准>>> 论坛里有人说要拿红外控制GPIO弄小车,问我怎么弄,我就写了这个帖子我在GPIO口上焊了4个LED,代表上下左右 不止可以控制gpio,还可以执行任意shell不是lirc,是我自…

思科OSPF辅助地址
实验拓扑图:6台路由器和1台交换机和3台PC机R1的配置R1#R1#conf tEnter configuration commands, one per line. End with CNTL/Z.R1(config)#int e0/0R1(config-if)#ip address 192.168.2.1 255.255.255.0R1(config-if)#no sh R1(config-if)#int e0/1R1(config-if)…

赠书 | GNN 模型在生物化学和医疗健康中的典型应用
计算生物化学和医疗健康的数据常常通过图来表示。例如,分子和化合物可以自然地表示为以原子为节点、以键为边的图。蛋白质相互作用(Protein-ProteinInteractions,PPI)记录了两个或多个蛋白质之间的物理联系, 这种联系可以很自然地…

C#控制远程计算机的服务
在.net中提供了一些类来显示和控制Windows系统上的服务,并可以实现对远程计算机服务服务的访问,如System.ServiceProcess命名空间下面的ServiceController 类,System.Management下面的一些WMI操作的类。虽然用ServiceController可以很方便的实…

百度WordPress结构化数据插件上线
2019独角兽企业重金招聘Python工程师标准>>> 博客文章收录慢?内容收录不全?马上使用百度WordPress结构化数据插件,轻松解决博客内容的收录问题,同时内容还能够在搜索结果中获得更丰富的展现,提高用户点击率…

MailMail、RegeX等程序的云端版
云端是一款优秀的国产软件,它通过虚拟环境的方式使软件与系统隔离,使软件做到免安装、易于删除、不留残余垃圾。 (这里捎带提醒一下,云端与Visual Studio有冲突,必须在禁用云端服务的情况下安装,详见《Visu…

java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一、静态成员变量(Static) * 1、静态成员变量为类变量,所有对象共享同一内存空间 * 2、静态成员变量的声明和定义仅在首次加载类时执行一次 * 3、首次加载类…

什么?我要对AI礼貌?人机交互面临的道德漏洞
作者 | 库珀来源 | 数据实战派头图 | 付费下载于 IC Photo如果你在一条道路上行驶,突然前面拐弯处出现一辆无人驾驶汽车,你会继续坚持你的道路优先权,还是让位使它先过去?目前,我们大多数人在涉及其他人的情况下能表现…

C#多线程共享数据
在多线程编程中,我们经常要使用数据共享.C#中是如何实现的呢?很简单,只要把你要共享的数据设置成静态的就可以了.关键字static .如下: static Queue q1new Queue(); static int b0; 在这里我定义了一个整形变量b和队列q1. 接下去就可以创建多线程代码了.如下: MyThread m…

异常-----Java compiler level does not match解决方法
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请…

求几亿个数中不重复元素的个数
题目: 有2.5亿个无符号整数(但在文件里面),要求找出这2.5亿个数字里面,不重复的数字的个数(那些只出现一次的数字的数目);另外,可用的内存限定为600M;要求算法…

进一步提升用户信息安全保护意识 小米安全与隐私宣传月完满落幕
6月29日,第二届小米安全与隐私宣传月活动完美落幕。活动通过多形式、多层次、全方位展示了小米在信息安全与用户隐私保护方面的实践和成就,进一步提升小米全体员工保护消费者个人信息的安全意识,为小米全线产品的安全防护水平奠定基础。 闭幕…

已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。
已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。答案: int max(int a,int b){return (ababs(a-b))/2;}类似的 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句 答案࿱…

flume源码学习8-hdfs sink的具体写入流程
上一篇说了HDFSEventSink的实现,这里根据hdfs sink的配置和调用分析来看下sink中整个hdfs数据写入的过程: 线上hdfs sink的几个重要设置 12345678hdfs.path hdfs://xxxxx/%{logtypename}/%Y%m%d/%H: hdfs.rollInterval 60 hdfs.rollSize 0…

详解zabbix中文版安装部署
一、zabbix简介(摘自百度百科)zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在…

赠书 | 图解机器学习算法,看这文就够了!
机器学习指的是计算机根据给定的问题、课题或环境进行学习,并利用学习结果解决问题或课题等的一整套机制(图 1-1)。 图 1-1 分类的示意图与机器学习共同成为热门话题的还有人工智能和深度学习。这里梳理一下它们之间的关系(图 1-…

C#获得文件版本信息及只读文件的删除
获取文件的版本信息: FileVersionInfo myFileVersionInfo1 FileVersionInfo.GetVersionInfo("D://TEST.DLL"); textBox1.Text"版本号: " myFileVersionInfo1.FileVersion; 更改文件属性,删除只读文件: 下例欲将E:/test.txt文件…

组策略 从入门到精通(二) 如何区别跨越WAN网的计算机对组策略的套用
如果客户机与DC中间跨越了网络,造成传输速率慢的情况,我们希望通过策略中的一些元素,达成对这些计算机的另类处理。但我们并不知道这些计算机哪些与我们DC之间属于低速连接,哪些属于高速连接,那么我们要如何通过组策略…

插入记录时单引号的处理
由于Content, Title中可能包含单引号,直接使用sql的insert命令会报错,对此有两种处理方法,一种将单引号替换成两个单引号,第2种方法是使用存储过程。 表myBBS的格式定义如下: CREATE TABLE [dbo].[myBBS] ( [ID] [bi…

仅用 480 块 GPU 跑出万亿参数!全球首个“低碳版”巨模型 M6 来了
继今年 3 月阿里达摩院发布国内首个千亿参数多模态大模型 M6(MultiModality-to-MultiModality MultitaskMega-transformer,以下简称 M6) 之后,6 月 25 日,达摩院宣布对 M6 进行全新升级,带来“低碳版”巨模…