字段驼峰转换
前言
属性驼峰转换主要有三种配置形式:针对全局配置、针对具体类配置以及针对具体属性配置。他们生效的优先级顺序以此是:属性 > 类 > 全局。
先定义一个示例类,用于之后说明:
@Getter
@Setter
public class Author {
private String username;
private String idCard;
private String mobilePhone;
}
全局配置
全局配置借助 com.fasterxml.jackson.databind.PropertyNamingStrategy实现:
public class PropertyNamingStrategy // NOTE: was abstract until 2.7
implements java.io.Serializable
{
/**
* 示例: id_card
*/
public static final PropertyNamingStrategy SNAKE_CASE = new SnakeCaseStrategy();
/**
* 示例: IdCard
*/
public static final PropertyNamingStrategy UPPER_CAMEL_CASE = new UpperCamelCaseStrategy();
/**
* 示例: idCard
*/
public static final PropertyNamingStrategy LOWER_CAMEL_CASE = new PropertyNamingStrategy();
/**
* 示例: idcard
*/
public static final PropertyNamingStrategy LOWER_CASE = new LowerCaseStrategy();
/**
* 示例: id-card
*/
public static final PropertyNamingStrategy KEBAB_CASE = new KebabCaseStrategy();
}
我们只需要使用 ObjectMapper.setPropertyNamingStrategy即可:
public static void main(String[] args) throws JsonProcessingException {
Author author = new Author();
author.setUsername("张三");
author.setIdCard("31000000000000");
author.setMobilePhone("13500000000")
ObjectMapper mapper = new ObjectMapper()
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
System.out.println("SNAKE_CASE:");
System.out.println(mapper.writeValueAsString(author));
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
System.out.println("UPPER_CAMEL_CASE:");
System.out.println(mapper.writeValueAsString(author));
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
System.out.println("LOWER_CAMEL_CASE:");
System.out.println(mapper.writeValueAsString(author));
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
System.out.println("LOWER_CASE:");
System.out.println(mapper.writeValueAsString(author));
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
System.out.println("KEBAB_CASE:");
System.out.println(mapper.writeValueAsString(author));
}
输出示例:
SNAKE_CASE:
{"username":"张三","id_card":"31000000000000","mobile_phone":"13500000000"}
UPPER_CAMEL_CASE:
{"Username":"张三","IdCard":"31000000000000","MobilePhone":"13500000000"}
LOWER_CAMEL_CASE:
{"username":"张三","idCard":"31000000000000","mobilePhone":"13500000000"}
LOWER_CASE:
{"username":"张三","idcard":"31000000000000","mobilephone":"13500000000"}
KEBAB_CASE:
{"username":"张三","id-card":"31000000000000","mobile-phone":"13500000000"}
针对具体类配置
针对类的配置同样是借助于 com.fasterxml.jackson.databind.PropertyNamingStrategy。区别是需要在类上使用 @JsonNaming注解:
@JsonNaming(PropertyNamingStrategy.KebabCaseStrategy.class)
//@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
//@JsonNaming(PropertyNamingStrategy.LowerCaseStrategy.class)
//@JsonNaming(PropertyNamingStrategy.KebabCaseStrategy.class)
// ...
public class Author {
}
public static void main(String[] args) throws JsonProcessingException {
Author author = new Author();
author.setUsername("张三");
author.setIdCard("31000000000000");
author.setMobilePhone("13500000000")
ObjectMapper mapper = new ObjectMapper()
// 优先级小于 @JsonNaming, 这里不会生效
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
System.out.println(mapper.writeValueAsString(author));
}
针对具体属性
@Getter
@Setter
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class) // 优先级顺序小于 @JsonProperty
public class Author {
private String username; // @JsonNaming 只会针对该属性生效
@JsonProperty("id_card")
private String idCard;
@JsonProperty("mobile-phone")
private String mobilePhone;
}
public static void main(String[] args) throws JsonProcessingException {
Author author = new Author();
author.setUsername("张三");
author.setIdCard("31000000000000");
author.setMobilePhone("13500000000");
ObjectMapper mapper = new ObjectMapper();
// 优先级小于 @JsonNaming, 这里不会生效
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
System.out.println(mapper.writeValueAsString(author));
}
输出示例:
{"Username":"张三","id_card":"31000000000000","mobile-phone":"13500000000"}