Jackson Elaboration Part 4- @ JacksonInjectおよび@JsonAliasアノテーション

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

このセクションでは、JSON逆シリアル化プロセスで@JacksonInjectアノテーションと@JsonAliasアノテーションを使用する方法を引き続き紹介します

1.@JacksonInject注釈

逆シリアル化にJSON形式を使用する場合、多くの場合、このような要件があります。クライアントまたは他のチャネルからJSON形式のデータオブジェクトを取得しました。これにはいくつかの属性が含まれています。ただし、JSON文字列を逆シリアル化するときは、次のようなデフォルトのデータを追加する必要があります。

  • responseTimeデータの応答時間。現在の時間を割り当てるだけです。
  • システムの現在のユーザーに割り当てられたデータ逆シリアル化のオペレーターなど。

クライアント自体から返されるデータにはこれらの追加情報は含まれていません。現時点では、JSON文字列がオブジェクトに逆シリアル化されるときに、JacksonInjectアノテーションを使用してこれらの追加情報を追加できます。以下は、JacksonInjectの使用方法です。

@Data
public class PlayerStar {

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

  @JacksonInject("responseTime")      //注意这里
  private LocalDateTime responseTime;
}

デシリアライズプロセスをテストしてみましょう。responseTime情報は以下のjsonInStringには含まれておらず、デシリアライズするときにJavaオブジェクトに挿入されることに注意してください。

@Test
void testJSON2Object() throws IOException {
  //为responseTime赋值为当前值
  InjectableValues.Std iv = new InjectableValues.Std();
  iv.addValue("responseTime", LocalDateTime.now());

  ObjectMapper mapper = new ObjectMapper();
  mapper.setInjectableValues(iv);       //将可插入值,在反序列化过程中赋值给对象

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

  System.out.println(jordan);

}

最終的な逆シリアル化の結果、JavaオブジェクトのtoString()メソッドの出力結果は次のとおりです。現在の時刻であるresponseTime割り当て属性がもう1つあることがわかります。

PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=null, salary=null, responseTime=2020-09-22T06:41:09.192)

次に、データ型の種類に応じてデータ注入を実行します

上記のコードでは、JSON文字列がオブジェクトに逆シリアル化され、属性idメソッドを使用して挿入されます。

  @JacksonInject("responseTime")      //注意这里responseTime为属性id
  private LocalDateTime responseTime;
  InjectableValues.Std iv = new InjectableValues.Std();
  iv.addValue("responseTime", LocalDateTime.now());  //注意这里responseTime为属性id,而这要统一

属性IDによるデータ注入に加えて、データ注入にJavaタイプのデータ型を使用することもできます。このメソッドは、複数のLocalDateTimeメンバー変数を定義するなど、Javaクラスで複数のメンバー変数データ型が繰り返される場合に使用すると不便です。したがって、データ注入には属性IDメソッドを使用することをお勧めします。

  @JacksonInject
  private LocalDateTime responseTime;
  InjectableValues.Std iv = new InjectableValues.Std();
  iv.addValue(LocalDateTime.class, LocalDateTime.now());  //注意这里LocalDateTime.class

3つ、@JsonAlias注釈

開発プロセスでは、v1.0バージョンのPlayerStarクラス(上記)にname属性が含まれていると定義できますが、これを使用して、名前という単語が一般的すぎて、多くの場合システムキーワードであることがわかります。場所;このメンバー変数の名前をv2.0バージョンで変更することを望んでいます。これはstarNameまたはplayerNameと呼ばれます。ただし、ユーザーがv1.0インターフェイスを放棄することは望ましくありません。つまり、複数のバージョンとの互換性を望んでいます。クライアントから送信されるJSON文字列は、name、playerName、またはstarNameです。私たちは何をすべき?答えは@JsonAlias注釈を使用することです

@Data
public class PlayerStar {

  @JsonAlias({"starName", "playerName" })
  private String name;

次の3つのJSON形式のデータをPlayerStarオブジェクトに正しく逆シリアル化し、nameメンバー変数に値を割り当てることができます

String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
String jsonInString = "{\"starName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";
String jsonInString = "{\"playerName\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";

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

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

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

おすすめ

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