@JsonCreatorカスタム逆シリアル化関数-JSONフレームワークJacksonElaboration Part 5

JacksonはSpringBoot(SpringBoot)のデフォルトのJSONデータ処理フレームワークですが、Springライブラリには依存しません。JacksonはSpringフレームワークでのみ使用できると考える友人もいますが、そうではありません。そのような制限はありません。多くのJSONデータ処理メソッドとアノテーションに加えて、ストリーミングAPI、ツリーモデル、データバインディング、複雑なデータ型変換などの機能を提供します。シンプルで使いやすいですが、決して小さなおもちゃではありません。内容については、5〜10の記事を連載しますので、引き続きご注目ください。

このセクションでは、@JsonCreatorアノテーションと@ConstructorPropertiesアノテーションを使用して、JSON逆シリアル化プロセスで逆シリアル化関数をカスタマイズする方法を引き続き紹介します

1.ジャクソンの逆シリアル化プロセスは何をしましたか?

JacksonのJSONデータ形式の場合、逆シリアル化プロセスは、JSON文字列をJavaオブジェクトに逆シリアル化することです。

ObjectMapper mapper = new ObjectMapper();

//将JSON字符串反序列化为java对象
String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
PlayerStar3 jordan = mapper.readValue(jsonInString, PlayerStar3.class);

System.out.println(jordan);

デフォルトでは、逆シリアル化プロセス中にジャクソンが呼び出す関数を紹介します

  • 最初に、逆シリアル化されたターゲットクラスPlayerStar3のパラメーターなしのコンストラクターを呼び出して、Javaオブジェクト構築します。
  • 次に、クラスのメンバー変数のsetメソッドを呼び出して、オブジェクトの各メンバー変数に値を割り当てます。

したがって、デフォルトでは、Javaクラスは逆シリアル化にJacksonを使用し、パブリックパラメーターレスコンストラクター(Javaで記述されておらず、デフォルトがあります)が必要であり、メンバー変数のsetメソッドが必要です。

2.@JsonCreator注釈

デフォルトでは、Jacksonの逆シリアル化プロセスは上記のとおりであり、パラメーターなしのコンストラクターとsetメソッドを使用します。さらに、@JsonCreatorアノテーションを使用して逆シリアル化プロセスをカスタマイズすることもできます。カスタム逆シリアル化関数では、柔軟性高く指定されていないアクションをより多く実行できます。2つのカスタム逆シリアル化チャネルがあります。

  • @JsonCreator工法に注釈を追加
  • @JsonCreatorアノテーションがファクトリ静的メソッドに追加されます

@JsonCreatorアノテーションの後に使用されるアノテーションは、メソッドの逆シリアル化された構築オブジェクトを使用してマークされ、引数のないデフォルトのコンストラクターを使用し、メソッドは逆シリアル化プロセスの失敗を設定します。

2.1。@JsonCreator構築方法に注釈が追加されます

このPlayerStar3に対応するJSON文字列は、最初のセクションのjsonInStringです。次のコンストラクターでは、Javaオブジェクトのメンバー変数に割り当てる属性値を使用@JsonProperty("salary")して定義します。

public class PlayerStar3 {

  private String name;
  private Integer age;
  private String[] hobbies;    //业余爱好,数组
  private List<String> friends;   //  朋友
  private Map<String, BigDecimal> salary; //年收入 Map

  //这段是我们的核心代码,使用JsonCreator注解说明该方法是反序列化构造方法。
  @JsonCreator
  public PlayerStar3(@JsonProperty("name") String name,
                     @JsonProperty("age") Integer age,
                     @JsonProperty("hobbies") String[] hobbies,
                     @JsonProperty("friends") List<String> friends,
                     @JsonProperty("salary") Map<String, BigDecimal> salary) {
    this.name = name;
    this.age = age;
    this.hobbies = hobbies;
    this.friends = friends;
    this.salary = salary;
  }

  //这里省略一个toString()方法
}

最初のセクションの逆シリアル化コードを使用してjsonInStringを逆シリアル化し、PlayerStar3オブジェクトを作成します。コンソールの出力結果は次のとおりです(オブジェクトのtoString()メソッドの出力)。

PlayerStar3{name='乔丹', age=45, hobbies=[高尔夫球, 棒球], friends=null, salary=null}

@JsonCreator実際、Javaオブジェクトのデシリアライゼーション・プロセスの使用は、プロセスの構成であると、ブレークポイントの設定を標識する方法。

2.2。@JsonCreatorファクトリ静的メソッドにアノテーションが追加されました

@JsonCreator構築メソッド追加するだけでなく、静的ファクトリ関数を使用してJavaオブジェクトを逆シリアル化および構築することもできます。使用方法は以下のとおりです。

public class PlayerStar3 {

  //  省略若干成员变量的定义,和上文一样

  @JsonCreator
  public static PlayerStar3 createPlayer(@JsonProperty("name") String name,
                                         @JsonProperty("age") Integer age,
                                         @JsonProperty("hobbies") String[] hobbies,
                                         @JsonProperty("friends") List<String> friends,
                                         @JsonProperty("salary") Map<String, BigDecimal> salary) {
    PlayerStar3 player = new PlayerStar3();  //new 一个java对象
    player.name = name;    //赋值
    player.age = age;
    player.hobbies = hobbies;
    player.friends = friends;
    player.salary = salary;
    return player;
  }
    //这里省略一个toString()方法
}

@JsonCreator静的ファクトリメソッドに追加されたアノテーションを使用すると、同じ効果の逆シリアル化を実現できます。

3つ、@ConstructorProperties注釈

@ConstructorProperties@JsonCreatorアノテーションの役割はアノテーションの役割と同じですが、逆シリアル化関数としてのみ構築メソッドに追加できます。しかし、その文法はより簡潔であり、@JsonProperty注釈なしで使用する方が便利です。また、柔軟性も提供します。構築メソッドの逆シリアル化プロセス中に、オブジェクトに対してより多くの不特定の操作を実行できます。

@ConstructorProperties({"name", "age","hobbies", "friends","salary"})
public PlayerStar3(String name,
                   Integer age,
                   String[] hobbies,
                   List<String> friends,
                   Map<String, BigDecimal> salary) {
  this.name = name;
  this.age = age;
  this.hobbies = hobbies;
  this.friends = friends;
  this.salary = salary;
}

@ConstructorProperties同じ効果の逆シリアル化を実現するには、構築メソッドに追加されたアノテーションを使用します。

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/108745009