看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而JSON操作技巧则说明如何通过JPath来快速的定位JSON的属性节点从而达到灵活读写JSON目的。
一、JSON转换器(JsonConverter)使用及原理介绍篇现在都流行微服务,前后端分离,而微服务之间、前后端之间数据交互更多的是基于REST FUL风格的API,API的请求与响应一般常用格式都是JSON。当编写了一些API后,为了能够清楚的描述API的请求及响应数据格式(即:JSON格式),以便提供给API服务的消费者(其它微服务、前端)开发人员进行对接开发,通常是编写API说明文档,说明文档中一般包含入参JSON格式说明以及响应的JSON格式说明示例,但如果API涉及数目较多,全由开发人员人工编写,那效率就非常低下,而且不一定准确。于是就有了Swagger,在API项目中集成swagger组件,就会由swagger根据API的ACTION方法定义及注解生成标准的在线API说明文档,具体用法请参见网上相关文章说明。当然除了swagger还有其它类似的集成式的生成在线API说明文档,大家有兴趣的话可以去网上找找资源。虽说swagger组件确实解放了开发人员的双手,无需人工编写就自动生成在线API文档,但我认为还是有一些不足,或者说是不太方便的地方:一是必需集成到API项目中,与API项目本身有耦合与依赖,无法单独作为API帮助文档项目,在有些情况下可能并不想依赖swagger,不想时刻把swagger生成API文档暴露出来;二是目前都是生成的在线API文档,如果API在某些网络环境下不可访问(比如:受限),那在线的API文档基本等同于没用,虽说swagger也可以通过复杂的配置或改造支持导出离线的API文档,但总归是有一定的学习成本。那有没有什么替代方案能解决swagger类似的在线API文档的不足,又避免人工低效编写的状况呢?可能有,我(梦在旅途)没了解过,但我为了解决上述问题,基于.NET动态编译&Newtonsoft.Json封装实现了一个JSON转换器(JsonConverter),采用人工编写+JSON自动生成的方式来实现灵活、快速、离线编写API说明文档。
先来看一下JsonConverter工具的界面吧,如下图示:
工具界面很简单,下面简要说明一下操作方法:
class类源代码转换成Json字符串:先将项目中定义的class类源代码复制粘贴到Class Code文本框区域【注意:若有继承或属性本身又是另一个类,则相关的class类定义源代码均应一同复制,using合并,namespace允许多个,目的是确保可以动态编译通过】,然后点击上方的【Parse】按钮,以便执行动态编译并解析出Class Code文本框区域中所包含的class Type,最后选择需要生成JSON的class Type,点击中间的【To Json】按钮,即可将选择的class Type 序列化生成JSON字符串并展示在右边的Json String文本框中;
示例效果如下图示:(支持继承,复杂属性)
有了这个功能以后,API写好后,只需要把ACTION方法的入参class源代码复制过来然后进行class to JSON转换即可快速生成入参JSON,不论是自己测试还是写文档都很方便。建议使用markdown语法来编写API文档。
Json字符串转换成class类定义源代码:先将正确的JSON字符串复制粘贴到Json String文本框中,然后直接点击中间的【To Class】按钮,弹出输入要生成的class名对话框,输入后点击确定就执行转换逻辑,最终将转换成功的class定义源代码展示在左边的Class Code文本框区域中;
示例效果如下图示:(支持复杂属性,能够递归生成JSON所需的子类,类似如下的Address,注意暂不支持数组嵌套数组这种非常规的格式,即:[ [1,2,3],[4,5,6] ])
JsonConverter工具实现原理及代码说明:
class Code To Json 先利用.NET动态编译程序集的方式,把class Code动态编译成一个内存的临时程序集Assembly,然后获得该Assembly中的Class Type,最后通过反射创建一个Class Type空实例,再使用Newtonsoft.Json 序列化成JSON字符串即可。