你到底会不会用json,如何解耦
最近代码上有个问题:
接入第三方系统,他的数据返回的格式是Json,比如数据内容是简历,里面把数据的每个内容给打到各个指定的字段中。
我们这个系统接到这段内容后,如果需要处理,需要把它的返回按照格式进行各层次的Java类的定义,有时候会涉及到很多类型和结构。而我们仅仅是数据取出来而已。需要创建这么复杂的结构。
所以针对这种模式,我们仅仅是为了获取部分或一部分内容,又不希望把此结构全部定义出来,我们把目光转向了之前用过的jsoncode包。
它的使用方法是:
String companyName = JsonCode.getValue(destString, "$.resume.workList.company")
这样就可以从目标的json字符串中获取到在对应位置的字段。代码中也不需要定义结构了,直接通过一个字符串解决问题。
但是问题还没有结束。
我们系统中取到这些简历信息后,需要将内容投送到另外一个系统进行解析,但是需要时类似的一个简历的标准格式,不能传送一个json,因为里面包含了太多的key值,无法解析。
我们继续想下去:
现在是要的一批数据,而不是单独的数据,使用如上的方案不合适,其实这个时候是最好定义出来所有的java类比较合适,因为需要的字段比较多,但是一旦这样做了,我们还是包含了太多了我们不需要的代码定义和一大堆的解析。是否有一个比较合适的方案去解决这个问题。
思维来源:FreeMaker
项目中有个功能在使用FreeMaker,相对来说还是比较好用的。我们目前的需求其实就是想把json字段填充到对应的模版字符串中,形成新的字符串,也就是我们需要的“简历”文件。
想到这,于是在jsoncode中动刀,添加此功能。
最后的使用如下:
- 定义模版文件。
#定义出模版文件
个人简历
姓名:{$.res_name}
电话:{$.res_tel}
邮箱:{$.res_email}
性别:{$.res_sex_name}
出生年月:{$.res_birth_year}
教育:{$.res_edulevel_name}
自我评价
{$.res_selfassess}
- 生成
FileTemplate fileTemplate = FileTemplate.init("文件");
# 返回值result就是把对应json字符串destString对应的字符写入到模版中的结果
String result = FileTemplate.parseResult(destString);
这样我们就很方便的获得这个结果。
但是目前还有最后一个问题
简历信息包含了工作经历和教育经历等是列表循环的结构,这个功能是我们必须需要支持的,这样才能算是基本满足要求。
于是我们又支持了json的List结构,实现模版文件的循环支持,模版如:
个人简历
姓名:{$.res_name}
电话:{$.res_tel}
邮箱:{$.res_email}
性别:{$.res_sex_name}
出生年月:{$.res_birth_year}
教育:{$.res_edulevel_name}
自我评价
{$.res_selfassess}
教育经历
for {$.eduExpDtoList}
时间:{@.red_start} - {@.red_start} 学校:{@.red_school}
专业:{@.red_special} 学历:{@.red_degree_name}
end
我们加入了for end的关键字实现循环,如上需要$.eduExpDtoList对应在json的结构为json数组结构。
同时,为了还支持了相对路径的取值,如循环中的@.red_start 就是循环中元素的路径结构。
致此,我们完成这个jsoncode支持模版的方案,接入到项目中,无代码的窜入,完美的实现了代码的解藕。
附项目路径如下:
代码:https://github.com/lujinfeifly/jsoncode
pom:https://mvnrepository.com/artifact/cn.miludeer/jsoncode