2017-01-30 13 views
3

私たちはバックエンドでcamelCasedプロパティを出力するAPIを消費し、これを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; 
    } 
} 

それは動作しますが、私は私達の入力があるので、それは非常にエレガントではないと思います常にキャメルケースと出力は常にsnakecaseです。 JSONシリアライゼーションをsnakecaseにグローバルに設定し、jackelのcamelcaseにデシリアライズする方法はありますか?

乾杯

答えて

2

を(それが何の違いを行う場合我々は、春RestTemplateと一緒に使用している)あなたは、それぞれpublic String nameForGetterMethod(...)public String nameForSetterMethod(...)方法で異なるロジックを定義し、独自のPropertyNamingStrategyを実装し、登録することができます。

0

は、出力用に個別に設定ObjectMapperを使用します。

ObjectMapper outputMapper = new ObjectMapper(); 
outputMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 

出力を書き込むためにそれを使用したプロパティは常にヘビの場合には書かれていることを保証します。

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); 
    } 
}; 
:あなたは、単一の ObjectMapperインスタンスを使用する必要がある場合

それとも、あなた自身の転送ProptertyNamingStrategyを作成

関連する問題