遇到一个需求,写完了功能,要和第三方对接,他们不能访问内部的接口平台文档,没办法只能将接口信息搞成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;
}
7099

被折叠的 条评论
为什么被折叠?



