Jackson modifies field names and custom naming
Reference:
https://heapdump.cn/article/1922495?from=mobile
1 Implementation method
- Use @JsonProperty to specify a fixed name for name mapping;
- Use the predefined naming strategy PropertyNamingStrategy
- Extend PropertyNamingStrategy to implement custom naming strategy.
2 Description and examples
2.1 @JsonProperty
Test entity class:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
A simple test class:
public class TestNaming {
public static void main(String[] args) throws JsonProcessingException {
User user = new User().setAge(11)
.setName("小明")
.setIdCard("13523451124");
System.out.println("原始json:" + new ObjectMapper().writeValueAsString(user));
}
}
The running results are as follows:
原始json:{
"age":11,"idCard":"13523451124","nameStr":"小明"}
Add @JsonProperty annotation:
@Data
@Accessors(chain = true)
public class User {
@JsonProperty(value = "nameStr")
private String name;
@JsonProperty(value = "ageStr")
private int age;
private String idCard;
}
Execute the test class again. The running results are as follows. The field names displayed are the names set on the annotations:
原始json:{
"idCard":"13523451124","nameStr":"小明","ageStr":11}
2.2 Predefined naming strategyPropertyNamingStrategy
- Note:
If the fields being operated need to follow the same naming rules, you can use the naming strategy PropertyNamingStrategy to simplify the naming operation. The specific strategies are as follows:
Strategy | illustrate | Example |
---|---|---|
SNAKE_CASE | Lowercase letters, separated by underscores | user_name |
UPPER_CAMEL_CASE | The first letter of the field is capitalized and no delimiters are used between words. | UserName |
LOWER_CAMEL_CASE | The first letter of the field is lowercase and no separators are used between words. | userName |
LOWER_CASE | Words are all lowercase and no separators are used between words. | username |
KEBAB_CASE | Words are in lowercase letters and separated by hyphens | user-name |
LOWER_DOT_CASE | Words are represented in lowercase letters and separated by dots | user.name |
- Example
Entity class:
@Data
@Accessors(chain = true)
public class User {
private String userName;
private int userAge;
private String userIdCard;
}
Test class:
public class TestNaming {
public static void main(String[] args) throws JsonProcessingException {
User user = new User().setUserAge(11)
.setUserName("小明")
.setUserIdCard("13523451124");
System.out.println("原始json:" + new ObjectMapper().writeValueAsString(user));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
System.out.println("SNAKE_CASE:" + objectMapper.writeValueAsString(user));
ObjectMapper objectMapper1 = new ObjectMapper();
objectMapper1.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
System.out.println("UPPER_CAMEL_CASE:" + objectMapper1.writeValueAsString(user));
ObjectMapper objectMapper2 = new ObjectMapper();
objectMapper2.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);
System.out.println("LOWER_CAMEL_CASE:" + objectMapper2.writeValueAsString(user));
ObjectMapper objectMapper3 = new ObjectMapper();
objectMapper3.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
System.out.println("LOWER_CASE:" + objectMapper3.writeValueAsString(user));
ObjectMapper objectMapper4 = new ObjectMapper();
objectMapper4.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
System.out.println("KEBAB_CASE:" + objectMapper4.writeValueAsString(user));
ObjectMapper objectMapper5 = new ObjectMapper();
objectMapper5.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_DOT_CASE);
System.out.println("LOWER_DOT_CASE:" + objectMapper5.writeValueAsString(user));
}
}
operation result:
原始json:{
"userName":"小明","userAge":11,"userIdCard":"13523451124"}
SNAKE_CASE:{
"user_name":"小明","user_age":11,"user_id_card":"13523451124"}
UPPER_CAMEL_CASE:{
"UserName":"小明","UserAge":11,"UserIdCard":"13523451124"}
LOWER_CAMEL_CASE:{
"userName":"小明","userAge":11,"userIdCard":"13523451124"}
LOWER_CASE:{
"username":"小明","userage":11,"useridcard":"13523451124"}
KEBAB_CASE:{
"user-name":"小明","user-age":11,"user-id-card":"13523451124"}
LOWER_DOT_CASE:{
"user.name":"小明","user.age":11,"user.id.card":"13523451124"}
2.3 Custom naming
Just inherit PropertyNamingStrategy.PropertyNamingStrategyBase and implement the translate() method:
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
public class SysLogNamingBaseTest extends PropertyNamingStrategy.PropertyNamingStrategyBase {
@Override
public String translate(String propertyName) {
return propertyName + "_";
}
}
2.3.1 Example 1
Test entity class:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
Rename the class:
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
/**
* <pre>
* json key值重命名
* </pre>
*
* @author loopy_y
* @since 2023/3/17
*/
public class SysLogNamingBase extends PropertyNamingStrategy.PropertyNamingStrategyBase {
@Override
public String translate(String propertyName) {
return propertyName + "^";
}
}
Test class:
public class TestNaming {
public static void main(String[] args) throws JsonProcessingException {
User user = new User().setAge(11)
.setName("小明")
.setIdCard("13523451124");
System.out.println("原始json:" + new ObjectMapper().writeValueAsString(user));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new SysLogNamingBase());
System.out.println("替换后的json:" + objectMapper.writeValueAsString(user));
}
}
Test Results:
原始json:{
"name":"小明","age":11,"idCard":"13523451124"}
替换后的json:{
"name^":"小明","age^":11,"idCard^":"13523451124"}
2.3.2 Example 2
Test entity class:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
Rename the class:
import cn.hutool.core.collection.CollUtil;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import org.apache.commons.lang3.StringUtils;
import java.util.Map;
/**
* <pre>
* 日志参数名称替换
* </pre>
*
* @author loopy_y
* @since 2023/3/17
*/
public class SysLogNamingBase extends PropertyNamingStrategy.PropertyNamingStrategyBase {
private Map<String, String> keyInfoMap;
public SysLogNamingBase(Map<String, String> map) {
this.keyInfoMap = map;
}
@Override
public String translate(String propertyName) {
if (CollUtil.isNotEmpty(keyInfoMap)) {
if (keyInfoMap.containsKey(propertyName) && StringUtils.isNotBlank(keyInfoMap.get(propertyName))) {
return keyInfoMap.get(propertyName);
}
}
return propertyName;
}
}
Test class:
public class TestNaming {
public static void main(String[] args) throws JsonProcessingException {
User user = new User().setAge(11)
.setName("小明")
.setIdCard("13523451124");
System.out.println("原始json:" + new ObjectMapper().writeValueAsString(user));
Map<String, String> nameMap = new HashMap<>();
nameMap.put("name", "姓名");
nameMap.put("age", "年龄");
nameMap.put("idCard", "身份证号");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new SysLogNamingBase(nameMap));
System.out.println("替换后的json:" + objectMapper.writeValueAsString(user));
}
}
Test Results:
原始json:{
"name":"小明","age":11,"idCard":"13523451124"}
替换后的json:{
"姓名":"小明","年龄":11,"身份证号":"13523451124"}