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

作者: 陆小飞 | 来源:发表于2021-05-31 16:42 被阅读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

    相关文章

      网友评论

        本文标题:你到底会不会用json,如何解耦

        本文链接:https://www.haomeiwen.com/subject/opjbsltx.html