根据json数据体快速生成规范的java类

一、问题背景:

作为一个java后端工程师的开发,除了维护自己软件系统提供的rest接口、mq消息队列、redis频道等等这些功能之外,少不了与其他后台系统或数据中台的数据交互。交互的过程不管是请求体或者返回体,如果都是使用通用的map,那代码的通用性维护性将会变得很差,而且也不符合java的“高内聚低耦合”的设计思路。除了那种接口调用获取的参数非常少的特例,这种情况下专门搞得对象就比较多余,大部分曾经都是非常适用的。

二、使用对比:

使用通用的参数map和统一的String做请求体和返回体时:(返回体往往还需要利用第三方jsonObject工具进行转变,这就有点不够酷了)

    public void post(String aUrl) {
        String url = baseUrl + aUrl;
        Map<String, Object> param = new HashMap<>();
        param.put("attr1", "value");
        param.put("attr2", true);        
        ResponseEntity<String> forEntity = restTemplate.postForEntity(url, param, String.class);
        
        System.out.println(forEntity.getBody());
    }

适用具体的请求体和返回体对象来承载时:

public void post1(String aUrl) {
        String url = baseUrl + aUrl;
        ARequest aRequest = new ARequest();
        aRequest.setAttr1("value");
        aRequest.setAttr2(true);
        BResppnse bResppnse= new BResppnse();
        ResponseEntity<bResppnse> forEntity = restTemplate.postForEntity(url, aResq, bResppnse.class);
}

三、快速生成对应JavaBean对象

3.1 在postman进行接口调用获取对应的json数据体,使用在线工具快速生成对应的代码

在线生成工具地址

在这里插入图片描述

一般我会把setter和getter函数删掉,使用lombok的注解让代码更加简洁

3.2 格式处理

如果你的json体名字是非常标准的按照小驼峰命名,那恭喜你你生成的命名格式都是符合规范的,不过遇到有些系统命名就是那种小写下划线就比较麻烦了,难道要手动改吗?字段少还好,多的话这也太慢了而且容易出错,这里我写一段py代码直接让你的代码生产效率一下子翻个好几倍

先看一下效果吧:

自动生成的代码如下:

        private String a_string;
        private String b_string;
        private boolean a_boolean;

py代码处理之后如下,解决了命名问题、还有类属性跟json字段耦合的问题:

        @JsonAlias("a_string")
        private String aString;

        @JsonAlias("b_string")
        private String bString;

        @JsonAlias("a_boolean")
        private boolean aBoolean;

由于我用得使用springboot自动集成的json格式化工具com.fasterxml.jackson,所以我这里格式化重命名的注释使用的是@JsonAlias,大家可以根据自己的项目使用情况进行简单更改

直接上一波代码,拿走不谢:

import re


def name_convert_to_camel(name: str) -> str:
    """下划线转驼峰(小驼峰)"""
    return re.sub(r'(_[a-z])', lambda x: x.group(1)[1].upper(), name)


def get_attr_value(line):
    """提取出属性名"""
    pattern = '.* (?P<attr>\w+)'
    mo = re.match(pattern, line)
    if mo:
        return mo.group('attr') if mo.group('attr') else None


if __name__ == '__main__':
    in_file_name = 'in.java'
    out_file_name = 'out.java'
    try:
        with open(in_file_name, 'r', encoding='utf-8') as r:
            lines = r.readlines()

        with open(out_file_name, 'w', encoding='utf-8') as w:
            for line in lines:
                attr = get_attr_value(line)
                w.writelines(f'        @JsonAlias("{attr}")' + '\n')
                new_attr_name = name_convert_to_camel(attr)
                new_line = line.replace(attr, new_attr_name)
                w.writelines(new_line + '\n')
    except FileNotFoundError as e:
        print(e)

如果想看代码运行的目录结构可以戳github代码链接:https://github.com/junkaitongxue/DreamKiteToolkit/tree/master/src/python/dreamkite/toolkit/module/tools

(以上为DreamKite本人原创,转载请附上原文链接)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_Kite

你的鼓励,是我不断创作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值