Jackson の変換対象についてちょっと勘違いしていたことがあって、改めて調べ直したものをせっかくなので記事にしました。
Jackson が JSON に出力してくれるもの
以下が条件となります。(過不足があればご指摘ください)
- public のフィールド
- public のゲッター
- 対応するフィールドがなくても、get で始まるメソッドがあれば出力対象となる
- boolean の場合は、is で始まる名前も対象となる
- can とか has などはならないっぽい
- ここまでの条件に当てはまっていても、
@JsonIgnore
アノテーションをつけると対象外となる(つけるのはフィールドでもゲッターでもよい)
サンプル
百聞は一見に如かず、ということで実際にやってみましょう。
変換対象クラス
JacksonSampleObject.java
import com.fasterxml.jackson.annotation.JsonIgnore;
public class JacksonSampleObject {
private Integer notOutputPrivate = 0;
protected Integer notOutputProtected = 1;
public Integer outputPublic = 2;
private Integer outputPrivateWithPublicGetter = 3;
public Integer getOutputPrivateWithPublicGetter() {
return outputPrivateWithPublicGetter;
}
protected Integer outputProtectedWithGetter = 4;
public Integer getOutputProtectedWithGetter() {
return outputProtectedWithGetter;
}
private Integer getNotOutputPrivateGetter() {
return 5;
}
protected Integer getNotOutputProtectedGetter() {
return 6;
}
public Integer getOutputPublicGetter() {
return 7;
}
@JsonIgnore
public Integer notOutputPublicWithIgnoreAnnotation = 8;
@JsonIgnore
public Integer getNotOutputPublicGetterWithIgnoreAnnotation() {
return 9;
}
private Boolean outputBoolean = true;
public Boolean isOutputBoolean() {
return outputBoolean;
}
public Integer isNotOutput() {
return 10;
}
public Boolean getOutputBooleanGetter() {
return true;
}
public Boolean canNotOutputBooleanMethod() {
return false;
}
}
実行クラス
JacksonSample.java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JacksonSample {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
System.out.println(mapper.writeValueAsString(new JacksonSampleObject()));
}
}
実行結果
{
"outputPublic" : 2,
"outputPrivateWithPublicGetter" : 3,
"outputProtectedWithGetter" : 4,
"outputBoolean" : true,
"outputPublicGetter" : 7,
"outputBooleanGetter" : true
}