实体类获取注释 搞成 json 说明

遇到一个需求,写完了功能,要和第三方对接,他们不能访问内部的接口平台文档,没办法只能将接口信息搞成json串给他们,但是字段太多,需要搞好久,做为程序员,能动手绝不动脑,搞个程序生成一下,必要说明的是,前人堆参数时 用了 swagger 注解来注释字段,字段说明都在 @ApiModelProperty中,当然如果有其他注解,原理一致,如果想要字段注释(/**/),请出门左拐,小弟不会😭,话不多说,上代码

效果是这样的,如果不是想要的,可以滑走了

{
    "errMsg": "String | 错误信息",
    "dataListChildren-订单行信息": {
        "headerId": "Long | 头id",
        "createUserId": "Long | 创建人ID"
    },
    "createUserId": "Long | 创建人ID"
}
public class YtbbMain {
    public static void main(String[] args) {
        // 需要生成 JSON 说明的类
        Class<?> clazz = YtbbHead.class;
        // 调用方法生成 JSON 说明
        Map<String, Object> result = generateJsonDescription(clazz);
        System.out.println(JSON.toJSONString(result));
    }

    @SneakyThrows
    public static Map<String, Object> generateJsonDescription(Class<?> clazz) {
        Map<String, Object> fieldDescriptions = new LinkedHashMap<>();
        Field[] fields = getFields(clazz);
        // 遍历类的所有字段
        for (Field field : fields) {
            // 获取字段上的 @ApiModelProperty 注解
            ApiModelProperty apiModelProperty = field.getAnnotation(ApiModelProperty.class);
            // 获取注解中的 value(描述信息)
            if (apiModelProperty != null) {
                String description = apiModelProperty.value();
                //是否为泛型
                if(field.getGenericType() instanceof ParameterizedType){
                    //获取泛型类对象
                    ParameterizedType genericType = (ParameterizedType)field.getGenericType();
                    Type[] actualTypeArguments = genericType.getActualTypeArguments();
                    String typeName = actualTypeArguments[0].getTypeName();
                    Class<?> tclass = Class.forName(typeName);
                    Map<String, Object> smap = generateJsonDescription(tclass);
                    fieldDescriptions.put(field.getName()+"-"+description,smap);
                }else {
                    // 获取字段类型
                    String fieldType = field.getType().getSimpleName();
                    // 将字段名、类型和描述信息放入 Map 中
                    fieldDescriptions.put(field.getName(), fieldType + " | " + description);
                }
            }
        }
        return fieldDescriptions;
    }
    public static final List<String> ING_CLASS = Arrays.asList("java.lang.Object","java.io.Serializable");
    public static Field[] getFields(Class<?> clazz){
        //排除一些无关类
        if(ING_CLASS.contains(clazz.getName())){
            return new Field[]{};
        }else {
            Field[] declaredFields = clazz.getDeclaredFields();
            Field[] superDeclaredFields = getFields(clazz.getSuperclass());
            Field[] allFields = new Field[declaredFields.length + superDeclaredFields.length];
            System.arraycopy(declaredFields,0,allFields,0,declaredFields.length);
            System.arraycopy(superDeclaredFields,0,allFields,declaredFields.length,superDeclaredFields.length);
            return allFields;
        }

    }
}

待生成json 的实体类,这里简单造几个属性 存在继承关系和嵌套关系

@Data
public class YtbbEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty("创建人ID")
    private Long createUserId;
}

@Data
public class YtbbHead extends YtbbEntity {

    @ApiModelProperty("错误信息")
    private String errMsg;

    @ApiModelProperty("行信息")
    private List<YtbbLine> dataListChildren;

    private String actualCustomerName;
}

@Data
public class YtbbLine extends YtbbEntity {

    @ApiModelProperty("头id")
    private Long headerId;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值