SpringCloudJava 核心技术Java服务器端编程

你到底会不会用json,如何解耦

2021-05-31  本文已影响0人  陆小飞

最近代码上有个问题:

接入第三方系统,他的数据返回的格式是Json,比如数据内容是简历,里面把数据的每个内容给打到各个指定的字段中。
我们这个系统接到这段内容后,如果需要处理,需要把它的返回按照格式进行各层次的Java类的定义,有时候会涉及到很多类型和结构。而我们仅仅是数据取出来而已。需要创建这么复杂的结构。

所以针对这种模式,我们仅仅是为了获取部分或一部分内容,又不希望把此结构全部定义出来,我们把目光转向了之前用过的jsoncode包。
它的使用方法是:

String companyName = JsonCode.getValue(destString, "$.resume.workList.company")

这样就可以从目标的json字符串中获取到在对应位置的字段。代码中也不需要定义结构了,直接通过一个字符串解决问题。

但是问题还没有结束。

我们系统中取到这些简历信息后,需要将内容投送到另外一个系统进行解析,但是需要时类似的一个简历的标准格式,不能传送一个json,因为里面包含了太多的key值,无法解析。

我们继续想下去:
现在是要的一批数据,而不是单独的数据,使用如上的方案不合适,其实这个时候是最好定义出来所有的java类比较合适,因为需要的字段比较多,但是一旦这样做了,我们还是包含了太多了我们不需要的代码定义和一大堆的解析。是否有一个比较合适的方案去解决这个问题。

思维来源:FreeMaker
项目中有个功能在使用FreeMaker,相对来说还是比较好用的。我们目前的需求其实就是想把json字段填充到对应的模版字符串中,形成新的字符串,也就是我们需要的“简历”文件。

想到这,于是在jsoncode中动刀,添加此功能。
最后的使用如下:

  1. 定义模版文件。
#定义出模版文件
个人简历

姓名:{$.res_name}
电话:{$.res_tel}
邮箱:{$.res_email}
性别:{$.res_sex_name}
出生年月:{$.res_birth_year}
教育:{$.res_edulevel_name}


自我评价
{$.res_selfassess}
  1. 生成
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

上一篇下一篇

猜你喜欢

热点阅读