原文链接:http://t.zoukankan.com/Jeffscnblog-p-10072483.html
在线JSON转JavaBean代码工具:http://tools.jb51.net/code/json2javabean
实现方法
场景:对接第三方公司,对方给了对接文档,通过对接文档中的json示例,生成javabean,然后根据javabean生成sql。
public static void main(String[] args) {
//得到APIModel注解的value
ApiModel model = BloodPressure.class.getAnnotation(ApiModel.class);
String description = model.value();
String tableName = BloodPressure.class.getName().substring(BloodPressure.class.getName().lastIndexOf(".") + 1);
Field[] fields = BloodPressure.class.getDeclaredFields();
String param = null;
String cameCaseColumn = null;
String underScoreCaseColumn = null;
StringBuilder sql = new StringBuilder();
//以下生成建表Sql
sql.append("create table ").append("t_" + tableName.toLowerCase()).append("(");
sql.append("\n");
for (Field f : fields) {
cameCaseColumn = f.getName();
underScoreCaseColumn = cameCaseColumn;
for (int i = 0; i < cameCaseColumn.length(); i++) {
if (Character.isUpperCase(cameCaseColumn.charAt(i))) {
// 将javabean中小驼峰命名变量的“大写字母”转换为“_小写字母”
underScoreCaseColumn = cameCaseColumn.substring(0, i) + '_' + cameCaseColumn.substring(i, i + 1).toLowerCase() + cameCaseColumn.substring(i + 1, cameCaseColumn.length());
}
}
sql.append(underScoreCaseColumn).append(" ");
param = f.getType().getTypeName();
//得到ApiModelProperty 注解的value
ApiModelProperty apiModelProperty = f.getAnnotation(ApiModelProperty.class);
if (param.equals("java.lang.Long")) {
sql.append("bigint(20) NOT NULL COMMENT '" + apiModelProperty.value() + "'");
} else {
// 根据需要自行修改
sql.append("VARCHAR(20) DEFAULT NULL COMMENT '" + apiModelProperty.value() + "'");
}
sql.append(",");
sql.append("\n");
}
sql.append("created_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',");
sql.append("\n");
sql.append("deleted tinyint(4) unsigned DEFAULT '0' COMMENT '0是未删除,1是已删除',");
sql.append("\n");
sql.append("PRIMARY KEY (`id`) USING BTREE");
//sql.delete(sql.lastIndexOf(","), sql.length());
sql.append("\n)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='" + description + "';");
System.out.println(sql);
}
java实体类
其中,@JsonProperty注解。
使用场景:对接第三方公司的数据时,第三方的对象的属性名首字母大写,为了规范,需要用驼峰命名,所以在json转实体类对象的时候使用@JsonProperty注解映射下。
对我来说,用@JSONField会比@JsonProperty好(自行百度区别),我也是之后才发现的,因为如果是带下划线的字段,@JsonProperty就无法映射了。
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author smilehan
* @date 2022/07/04 14:08
*/
@ApiModel("血压表")
@Data
@Accessors(chain = true)
public class BloodPressure implements Serializable {
@ApiModelProperty("主键id")
private Long id;
@JsonProperty("HighPressure")
@ApiModelProperty("收缩压")
private String highPressure;
@JsonProperty("LowPressure")
@ApiModelProperty("舒张压")
private String lowPressure;
@JsonProperty("Pulse")
@ApiModelProperty("脉搏")
private String pulse;
@JsonProperty("Result")
@ApiModelProperty("结论,-1:低压 0:正常 1:正常高压 2:轻度高压 3:中度高压 4:重度高压")
private String result;
}