動機
- JAVA SpringBootを利用したWEBシステム
- JSON文字列を入力として用い、データを保持するオブジェクトに変換する
- JSONにおける「0」の値をfalse、「1」の値をtrueとしてbooleanに変換して受け取りたい。
参考
概要
- JsonDeserializer を継承したデシリアライザクラスを作る
- public static class になる
- @JsonDeserialize(using=作成したデシリアライザクラス.class) で指定する
シリアライズとデリシアライズ
- シリアライズ
- ソフトウェアが扱うオブジェクトを、文字列表現に変換すること。
- オブジェクト→JSON。
- デシリアライズ
- 文字列表現のデータを、ソフトウェアが扱うオブジェクトに変換すること。
- JSON→オブジェクト
サンプルコード
パースしたいJSON
{
"name": "サンプルアイテム",
"required": "1"
}
データオブジェクト
- JSONが解釈、変換されてこのオブジェクトになる
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@JsonIgnoreProperties(ignoreUnknown = true)
public class SampleItem {
private String name;
@JsonDeserialize(using=NumericBooleanDeserializer.class) // 下記で作成するデシリアライザクラス
private boolean required; // ここは boolean でよい。JSONに該当の値がない場合FALSEになる。
}
デシリアライザ
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
/**
* JSON文字列変換時の設定(Boolean)。
* - 0 → false
* - 1 → true
*/
public static class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {
@Override
public Boolean deserialize(JsonParser parser, DeserializationContext context) throws IOException {
return !"0".equals(parser.getText());
}
}