JacksonはSpringBoot(SpringBoot)のデフォルトのJSONデータ処理フレームワークですが、Springライブラリには依存しません。JacksonはSpringフレームワークでのみ使用できると考える友人もいますが、そうではありません。そのような制限はありません。多くのJSONデータ処理メソッドとアノテーションに加えて、ストリーミングAPI、ツリーモデル、データバインディング、複雑なデータ型変換などの機能を提供します。シンプルで使いやすいですが、決して小さなおもちゃではありません。内容については、5〜10の記事を連載しますので、引き続きご注目ください。
- 「シリアル化と逆シリアル化のコア使用法-JSONフレームワークジャクソンエラボレーションパート1」
- 「特別なデータフォーマット処理-JSONフレームワークジャクソンエラボレーションパート2」
- 「属性シリアル化カスタムソートとアルファベット順ソート-JSONフレームワークJacksonElaboration Part 3」
このセクションでは、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\":[\"高尔夫球\",\"棒球\"]}";
私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります
- この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ。
あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!。また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。