簡體   English   中英

與Jackson不對稱的名稱/屬性映射,更優雅的解決方案?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM