2017-01-30 3 views
3

мы используем API с нашим бэкэнд, который выводит свойства camelCased, сопоставляем это с POJO, применяем некоторую бизнес-логику и затем выводим ее с помощью нашего API в некоторые приложения. Формат, который мы хотим вывести, - это свойства snake_case.Асимметричное отображение имени/свойств с помощью Jackson, более элегантное решение?

Этот тест описывает то, что мы хотим сделать:

@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 и выход всегда snakecase. Есть ли способ глобально установить сериализацию JSON для snakecase и десериализации на camelcase для jackson? (Мы используем его вместе с RestTemplate весной, если это делает никакой разницы)

Приветствия

ответ

2

Вы можете реализовать и зарегистрировать свой собственный PropertyNamingStrategy, где определить другую логику для public String nameForGetterMethod(...) и public String nameForSetterMethod(...) методов соответственно.

0

Используйте отдельно сконфигурирован 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); 
    } 
}; 
Смежные вопросы