URLや日付などの特別なデータ形式の処理-JSONフレームワークJacksonElaboration Part 2

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

この記事では、いくつかの特別なJOSNデータ形式処理-JSONフレームワークJackson Elaboration Part2を紹介します。

  • 1.URLからJSONデータを読み取ります
  • 2、不明なプロパティの割り当ての失敗処理
  • 3つの割り当てられていないJavaBeanのシリアル化
  • 第四に、日付のフォーマット

1.URLからJSONデータを読み取ります

Jacksonは、文字列をJava POJOオブジェクトに逆シリアル化するだけでなく、リモートAPIを要求し、リモートサービスからJSON応答結果を取得して、それらをJavaPOJOオブジェクトに変換することもできます。

@Test
void testURL() throws IOException {

  URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); //远程服务URL
  ObjectMapper mapper = new ObjectMapper();
  //从URL获取JSON响应数据,并反序列化为java 对象
  PostDTO postDTO = mapper.readValue(url, PostDTO.class); 

  System.out.println(postDTO);

}
  • jsonplaceholder.typicode.com 無料のHTTPテストサービスのウェブサイトであり、テストに使用できます
  • リモートサービスAPIの戻り結果はJSON文字列であり、投稿原稿にはuserId、id、title、content属性が含まれます
  • PostDTOは、自分で定義したJavaクラスであり、userId、id、title、contentメンバー変数も含まれています。

以下は、コンソールの印刷出力結果とpostDTOのtoString()メソッドの出力です。

PostDTO(userId=1, id=1, title=sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body=quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto)

2、不明なプロパティの割り当ての失敗処理

クライアントによって提供されるJSON文字列属性が、サーバーによって定義されたJavaクラスのメンバー変数を超える場合があります。

たとえば、上の図の2つのクラスは、

  • まず、PlayerStarをage属性を含むJSON文字列にシリアル化します
  • 次に、年齢属性を除いて、JSON文字列をPlayerStar2に変換します
@Test
void testUnknowProperties() throws IOException {
  ObjectMapper mapper = new ObjectMapper();
  PlayerStar player = PlayerStar.getInstance(); //为PlayerStar 各属性赋值,可以参考本系列文章第一篇

  //将PlayerStar序列化为JSON字符串
  String jsonString = mapper.writeValueAsString(player);
  System.out.println(jsonString);
  //将JSON字符串反序列化为PlayerStar2对象
  PlayerStar2 player2 = mapper.readValue(jsonString, PlayerStar2.class);
  System.out.println(player2);
}

デシリアライズすると、次の例外がスローされます。これは、JSON文字列に含まれる属性がJavaクラスの定義と重複しているためです(もう1つの経過時間があり、値を割り当てるときにsetAgeメソッドが見つかりません)。

{"age":45,"playerName":"乔丹"}

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class com.example.demo.javabase.PlayerStar2), not marked as ignorable (one known property: "playerName"])
 at [Source: (String)"{"age":45,"playerName":"乔丹"}"; line: 1, column: 10] (through reference chain: com.example.demo.javabase.PlayerStar2["age"])

age属性を無視し、Javaクラスの未定義のメンバー変数データを受け入れない場合は、次のメソッドを使用できます。UnrecognizedPropertyExceptionはスローされません。

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

3つの割り当てられていないJavaBeanのシリアル化

特定の種類のデータが空である可能性があることがわかっている場合があり、通常はそれに値を割り当てません。しかし、クライアントにはこの{}JSONオブジェクトが必要です。どうすればよいですか?

public class MyEmptyObject {
  private Integer i;  //没有get set方法
}

ObjectMapperのシリアル化を無効にする機能を設定できます:FAIL_ON_EMPTY_BEANS。これは、オブジェクトのすべての属性の割り当てを解除できることを意味します。

@Test
void testEmpty() throws IOException {

  ObjectMapper mapper = new ObjectMapper();
  mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

  String jsonString = mapper.writeValueAsString(new MyEmptyObject());
  System.out.println(jsonString);

}

デフォルトで設定しないと、次の例外InvalidDefinitionExceptionがスローされます。シリアル化機能の無効化機能FAIL_ON_EMPTY_BEANSを設定すると、{}文字列にシリアル化されます。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.demo.jackson.JacksonTest1$MyEmptyObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

第四に、日付のフォーマット

日付のフォーマットは、JSONのシリアル化および逆シリアル化プロセスの一般的な要件です

ObjectMapper mapper = new ObjectMapper();
Map temp = new HashMap();
temp.put("now", new Date());
String s = mapper.writeValueAsString(temp);
System.out.println(s);

デフォルトでは、Javaの日付と関連するタイプの場合、Jacksonのシリアル化の結果は次のようになります。

{"now":1600564582571}

JSONのシリアル化および逆シリアル化プロセスで日付をフォーマットする場合は、次の処理を行う必要があります。

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);  //注意这里
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));  //注意这里
Map temp = new HashMap();
temp.put("now", new Date());

String s = mapper.writeValueAsString(temp);
System.out.println(s);

コンソールの印刷出力は次のとおりです。

{"now":"2020-09-20"}

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

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

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

おすすめ

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