Java
Jackson

Jacksonよくある使い方メモ

まずは

簡単な使い方は以下を参照
Jackson使い方メモ

この記事では使用例をまとめたいと思います。

サンプルDTO

public class SampleDTO {
    private String field1;
    private List<String> field2;
    private SomeClass field3;

    public String getField1(){return field1};
    public List<String> getField2(){return field2};
    public SomeClass getField3(){return field3};
    public String getField3Text(){return field3.getText()};
}

DTOからJSONテキストを生成する

SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(dto);

DTOからObjectNodeを生成する

SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
ObjectNode jsonNode = mapper.valueToTree(dto);

ObjectNodeの値を元にDTOをアップデートする

SampleDTO dto = new SampleDTO();
ObjectMapper mapper = new ObjectMapper();
ObjectReader reader = mapper.readerForUpdating(dto);
reader.readValue(json);

不要な項目を無視する

以下のように無視したい項目にアノテーションを付与する。

@JsonIgnore
private String field1;

JSONのキー名を変更する

以下のように変更したい項目にアノテーションを付与する。

@JsonProperty("fieldA")
private String field1;

こうした場合、{"fieldA": "<field1の値>"}のようになる。

また、@JsonPropertyはメソッドに適用することも可能。

@JsonProperty("fieldA")
public String getField1(){
...
}

// JsonPropertyで設定した値とコンフリクトするメソッドが存在する場合は
// 不要な方にJsonIgnoreを付与する。
@JsonIgnore
public String getFieldA(){
...
}

// この場合setterも合わせて定義しないとうまく相互変換できない
@JsonSetter("fieldA")
public void setField1(String field1){
...
}

キャメルケースのフィールドをスネークケースでJSONに出力する。

以下のようなフィールドが定義されていた場合、
そのまま出力するとJSONに出力されるフィールド名はキャメルケースとなる。

private String sampleField;

@JsonPropertyを使用してフィールド名を変更する方法もあるが、
全てのフィールドに対して特定のルールで変換をかける場合はPropertyNamingStrategyを使用する。
キャメルケース⇒スネークケースについてはデフォルトの変換ロジックがあるためそれが利用できる。

ObjectMapper mapper = new ObjectMapper();
// 命名変更規則の設定  
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

JSONを出力する際に成形する

出力されるJSON文字列を成形したい場合は、mapperの設定を変更する。
例えば、適当なindentを設定する場合は以下のようにする。

// 出力するJSON
mapper.enable(SerializationConfig.Feature.INDENT_OUTPUT);