[英]Jackson Custom Property-Name to Type Mapping for Polymorphic Properties
[英]Asymmetric name/property mapping with Jackson, more elegant solution?
我們使用后端輸出一個API來輸出camelCased屬性,將其映射到POJO,應用一些業務邏輯,然后將我們的API輸出到某些應用程序。 我們要輸出的格式是snake_case屬性。
該測試描述了我們想要做的事情:
@Test
public void mappingTest() throws IOException {
String input = "{ \"merchantId\": 23, \"contactName\": \"foobar\" }";
ObjectMapper mapper = new ObjectMapper();
Merchant merch = mapper.readValue(input, Merchant.class);
String output = mapper.writeValueAsString(merch);
String expectedOutput = "{ merchant_id: 23, contact_name: 'foobar' }";
assertEquals("", expectedOutput, output);
}
目前模型類看起來像這樣:
@JsonInclude(Include.NON_NULL)
public class Merchant {
private String merchantId;
private String contactName;
public Merchant() {
}
public Merchant(final String merchantId, final String contactName) {
this.merchantId = merchantId;
this.contactName = contactName;
}
@JsonProperty("contact_name")
public String getContactName() {
return contactName;
}
@JsonProperty("contactName")
public void setContactName(final String contactName) {
this.contactName = contactName;
}
@JsonProperty("merchant_id")
public String getMerchantId() {
return merchantId;
}
@JsonProperty("merchantId")
public void setMerchantId(final String merchantId) {
this.merchantId = merchantId;
}
}
它可以工作,但我認為它不是很優雅,因為我們的輸入始終是camelcase,輸出總是蛇形。 有沒有辦法全局設置JSON序列化為snakecase和反序列化為camelcase為jackson? (我們在Spring中將它與RestTemplate一起使用,如果這有任何區別的話)
干杯
您可以實現並注冊自己的PropertyNamingStrategy
,分別為public String nameForGetterMethod(...)
和public String nameForSetterMethod(...)
方法定義不同的邏輯。
使用單獨配置的ObjectMapper
作為輸出:
ObjectMapper outputMapper = new ObjectMapper();
outputMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
使用它來編寫輸出可確保始終以蛇形表示屬性。
或者,如果您只需要使用一個ObjectMapper
實例,請創建自己的轉發ProptertyNamingStrategy
:
PropertyNamingStrategy myStrategy = new PropertyNamingStrategy() {
@Override
public String nameForGetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
return PropertyNamingStrategy.SNAKE_CASE.nameForGetterMethod(config, method, defaultName);
}
@Override
public String nameForSetterMethod(MapperConfig<?> config, AnnotatedMethod method, String defaultName) {
return PropertyNamingStrategy.LOWER_CAMEL_CASE.nameForSetterMethod(config, method, defaultName);
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.