跳到主要内容

字段驼峰转换

前言

属性驼峰转换主要有三种配置形式:针对全局配置、针对具体类配置以及针对具体属性配置。他们生效的优先级顺序以此是:属性 > 类 > 全局。

先定义一个示例类,用于之后说明:

@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"}