阅读目录

  • 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/

本文转自叶小钗 h数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_json_generator.html,如需转载请自行联系原作者

.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator相关推荐

  1. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    阅读目录 1.KwCombinatorics基本介绍 2.足球彩票排列组合应用 3.排列组合生成代码与测试 今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinator ...

  2. .NET平台开源项目速览(20)Newlife.Core中简单灵活的配置文件

    如果用知乎,可以关注专栏:.NET开源项目 记得5年前开始拼命翻读X组件的源码,特别是XCode,但对Newlife.Core 的东西了解很少,最多只是会用用,而且用到的只是九牛一毛.里面好用的东西太 ...

  3. .NET平台开源项目速览(2)Compare .NET Objects对象比较组件

    原文:.NET平台开源项目速览(2)Compare .NET Objects对象比较组件 .NET平台开源项目速览今天介绍一款小巧强大的对象比较组件.可以更详细的获取2个对象的差别,并记录具体差别,比 ...

  4. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    原文:.NET平台开源项目速览(1)SharpConfig配置文件读写组件 在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.Config ...

  5. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  6. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  7. .NET平台开源项目速览(4).NET文档生成工具ADB及使用

    .NET平台开源项目速览(4).NET文档生成工具ADB及使用 原文:.NET平台开源项目速览(4).NET文档生成工具ADB及使用 很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习 ...

  8. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

    今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...

  9. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    阅读目录 1.哈希算法介绍 2.HashLib功能介绍 .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部 ...

最新文章

  1. 能干掉苹果的中国黑客
  2. python spark 求解最大 最小 平均
  3. Android设计模式——单例模式(Singleton)
  4. mysql concat ws 效率,MySQL concat_ws()方法的用法
  5. 将一个c 语言源程序文件中所有注释去掉后,存入另一个文件.,C实验内容.doc
  6. Linux服务器---安装bind
  7. 886 微型计算机原理,886微型计算机原理及应用.pdf
  8. 负载均衡工具 haproxy 单机安装部署完整流程
  9. 潘维良(帮别人名字作诗)
  10. MyBatis的搭建流程(idea+maven)
  11. linux bash基本特性
  12. Linux-lamp
  13. 【sklearn第十六讲】集成方法
  14. (转)UIWebView的基本用法,适合新手
  15. 基于OCR的身份证要素提取-2019
  16. Linux文件--文件命名规则
  17. 网易云信 NIM_duilib 源码分析
  18. S3C2440之液晶屏LCD驱动
  19. CSS中:margin和padding的区别 margin:auto与margin: 0 auto区别
  20. PageNow企业级数据可视化开发平台

热门文章

  1. 关于String数组的用法
  2. Oracle VDI 安装
  3. C#综合揭秘——Entity Framework 并发处理详解
  4. Oracle中merge into的使用
  5. jdbc封装与多并发的共鸣
  6. FTP、HTTP断点续传和多线程的协议基础
  7. iOS-Swift中的递增(++)和递减(--)被取消的原因-官方答复
  8. JS子窗口调用父窗口中的函数
  9. 全球物联网产业规模不断扩大 中国市场前景分析
  10. apache httpd 1