Jackson はフィールド名とカスタム命名を変更します
参考:
https://heapdump.cn/article/1922495?from=mobile
1 実施方法
- @JsonProperty を使用して、名前マッピングの固定名を指定します。
- 事前定義された命名戦略を使用する PropertyNamingStrategy
- PropertyNamingStrategy を拡張してカスタム命名戦略を実装します。
2 説明と例
2.1 @JsonProperty
テストエンティティクラス:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
単純なテストクラス:
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));
}
}
実行結果は次のとおりです。
原始json:{
"age":11,"idCard":"13523451124","nameStr":"小明"}
@JsonProperty アノテーションを追加します。
@Data
@Accessors(chain = true)
public class User {
@JsonProperty(value = "nameStr")
private String name;
@JsonProperty(value = "ageStr")
private int age;
private String idCard;
}
テスト クラスを再度実行します。実行結果は次のとおりです。表示されるフィールド名は、アノテーションに設定された名前です。
原始json:{
"idCard":"13523451124","nameStr":"小明","ageStr":11}
2.2 事前定義された命名戦略PropertyNamingStrategy
- 注:
操作されるフィールドが同じ命名規則に従う必要がある場合は、命名戦略 PropertyNamingStrategy を使用して命名操作を簡素化できます。具体的な戦略は以下のとおりです。
戦略 | 説明する | 例 |
---|---|---|
SNAKE_CASE | アンダースコアで区切られた小文字 | ユーザー名 |
UPPER_CAMEL_CASE | フィールドの最初の文字は大文字で、単語の間に区切り文字は使用されません。 | ユーザー名 |
LOWER_CAMEL_CASE | フィールドの最初の文字は小文字であり、単語の間に区切り文字は使用されません。 | ユーザー名 |
小文字 | 単語はすべて小文字であり、単語間に区切り文字は使用されません。 | ユーザー名 |
ケバブ_ケース | 単語は小文字でハイフンで区切られています | ユーザー名 |
小ドット_ケース | 単語は小文字で表され、ドットで区切られます。 | ユーザー名 |
- 例
エンティティクラス:
@Data
@Accessors(chain = true)
public class User {
private String userName;
private int userAge;
private String userIdCard;
}
テストクラス:
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));
}
}
操作結果:
原始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 カスタム命名
PropertyNamingStrategy.PropertyNamingStrategyBase を継承し、translate() メソッドを実装するだけです。
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
public class SysLogNamingBaseTest extends PropertyNamingStrategy.PropertyNamingStrategyBase {
@Override
public String translate(String propertyName) {
return propertyName + "_";
}
}
2.3.1 例 1
テストエンティティクラス:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
クラスの名前を変更します。
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 + "^";
}
}
テストクラス:
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));
}
}
試験結果:
原始json:{
"name":"小明","age":11,"idCard":"13523451124"}
替换后的json:{
"name^":"小明","age^":11,"idCard^":"13523451124"}
2.3.2 例 2
テストエンティティクラス:
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
private String idCard;
}
クラスの名前を変更します。
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;
}
}
テストクラス:
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));
}
}
試験結果:
原始json:{
"name":"小明","age":11,"idCard":"13523451124"}
替换后的json:{
"姓名":"小明","年龄":11,"身份证号":"13523451124"}