6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[jackson]JSONの値「0」「1」をbooleanとして受け取りたい

Last updated at Posted at 2020-04-01

動機

  • 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());
  }
}
6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?