「こんにちは、アミーゴ!」

「こんにちは、エリー!」

「JSON についてはすでに紹介されているので、今日は JSON について詳しく話しましょう。」

「わかりました。普段どこで使われていますか?」

「通常の動作は次のとおりです。誰か (クライアント) が Java プログラム (サーバー) にデータを要求します。プログラムは Java オブジェクトを作成し、データベースからの情報をそれに埋め込みます。次に、それらを要求者 (クライアント) が指定する形式に変換します。 ) JSON などを理解して送り返すことができます。」

「Java で JSON を操作する方法を説明しましょう。基本的に必要なことは 2 つだけです。Java オブジェクトを JSON 形式にシリアル化することと、Java オブジェクトを JSON 形式から逆シリアル化することです。」

「言い換えれば、JSON は、あるプログラムから別のプログラムにメッセージやデータを送信するための標準です。そのような標準はたくさんあります。しかし、プログラムが JavaScript で書かれている場合、通常は JSON を使用しようとします。」

"大丈夫、準備できました。"

「わかりました。それでは始めましょう。」

JSON へのシリアル化 - 1

「すでにご存知のとおり、Java には標準のシリアル化ツールが組み込まれています。しかし、それらは JSON をサポートしていません。したがって、オブジェクトを JSON にシリアル化する必要がある場合は、その方法を知っている一般的なフレームワーク (ライブラリ) の 1 つを使用できます。これを行う。"

「これらの異なるフレームワークの違いは何ですか?」

「通常、それらは複雑さのレベルが異なります。非常に基本的なことしか実行できないフレームワークもありますが、それらは非常に小さくてシンプルです。そして、さらに多くのことを実行できる大規模で複雑なフレームワークもあります。」

「Jackson は最も人気のあるフレームワークの 1 つです。JSON の操作方法を検討する際に、これを例として使用します。」

「まず、このフレームワークをダウンロードしてプロジェクトに追加する必要があります。これは IntelliJ IDEA で直接行う必要があります。このリンクを使用してフレームワークをダウンロードできます。」

"終わり。"

「わかりました。では、続けましょう。」

「Java オブジェクトを JSON に変換するのは、シリアル化するのと同じくらい簡単です。これを行うには、特別な ObjectMapper クラス (com.fasterxml.jackson.databind.ObjectMapper) が必要です。」

「実際の例をお見せして、それを分析してみましょう。」

オブジェクトをJSONに変換する」
public static void main(String[] args) throws IOException
{
 // Create an object to be serialized into JSON
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // This is the Jackson object that performs the serialization
 ObjectMapper mapper = new ObjectMapper();

 // And here's the serialization itself: the first argument is where, and the second is what
 mapper.writeValue(writer, cat);

 // Convert everything written to the StringWriter into a String
 String result = writer.toString();
 System.out.println(result);
}
オブジェクトを JSON に変換する Cat クラス
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
シリアル化の結果と画面出力:
{"name":"Missy", "age":5, "weight":4}

「仕組みは次のとおりです。」

「4 行目から 7 行目では、 Catオブジェクトを作成し、それにデータを設定します。」

「10 行目では、オブジェクトの JSON 文字列表現を書き込む Writer オブジェクトを作成します。」

13 行目で、すべてのシリアル化を実行するObjectMapperオブジェクトを作成します。

「16 行目で、 catオブジェクトの JSON 表現をWriterに書き込みます。」

19 ~ 20 行目で、結果を画面に表示します。

「すべてが非常に単純に見えます。Java のネイティブ シリアル化ほど難しいものはありません。」

「逆シリアル化はどのようなものになるでしょうか?」

「ほぼ同じですが、短いだけです。」

JSONからオブジェクトを変換する
public static void main(String[] args) throws IOException
{
 String jsonString = "{ \"name\":\"Missy\", \"age\":5, \"weight\":4}";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
オブジェクトが JSON 形式から逆シリアル化されるクラス
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

「さらに簡単です。ObjectMapperを取得し、JSON を含む文字列または StringReader、および逆シリアル化するオブジェクトのクラスを渡します。次に、 readValueメソッドを呼び出し、出力として既製の Java オブジェクトを取得します。すべてのデータ。」

「そうですね、それは Java の逆シリアル化とまったく同じです。」

「ほとんどです。JSON にシリアル化または JSON から逆シリアル化されるオブジェクトには、いくつかの要件があります。」

" 1) フィールドは可視である必要があります。パブリックであるか、ゲッターとセッターを持っている必要があります。"

" 2) デフォルトのコンストラクター (パラメーターのないコンストラクター) が必要です"

「なるほど。それはそれほど驚くべきことではありません。しかし、Java はプライベート フィールドも含め、すべてをシリアル化しました。」

「そうですね、それは Java でした。Java は隠されたデータにアクセスできます。自分自身から隠すことはできません。」

「ここには 3 番目の側面があります。Cat クラスの @JsonAutoDetect アノテーションに気づいていただけたでしょうか?」

「はい。ちょうどそれが何なのか聞こうと思っていたところです。」

「これはアノテーションです。Jackson フレームワークのハウスキーピング情報です。適切なアノテーションを使用することで、JSON へのシリアル化の結果を非常に柔軟に制御できます。」

「すごい!どんな注釈があるの?」

「ここにいくつかの例があります:」

注釈 説明
@JsonAutoDetect 授業前に設置。
クラスを JSON にシリアル化する準備ができているとマークします。
@JsonIgnore プロパティの前に配置されます。
このプロパティはシリアル化中に無視されます。
@JsonProperty プロパティ、ゲッター、セッターの前に配置されます。シリアル化中に別のフィールド名を指定できます。
@JsonWriteNullProperties 授業前に設置。
null のオブジェクト フィールドは無視されません。
@JsonPropertyOrder 授業前に設置。
シリアル化中にフィールドの順序を指定できます。

「面白いですね!もっとあるの?」

「たくさんあります。しかし、今はそれらを取り上げません。次に、最初の例を少し作り直してみましょう。」

オブジェクトをJSONに変換する
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 StringWriter writer = new StringWriter();

 ObjectMapper mapper = new ObjectMapper();

 mapper.writeValue(writer, cat);

 String result = writer.toString();
 System.out.println(result);
}
オブジェクトを JSON に変換するクラス
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
シリアル化の結果と画面出力:
{"age":5, "alias":"Missy"}

「コードは同じですが、注釈を変更しました。名前フィールドに別の名前、エイリアスを指定しました。また、重みフィールドを無視としてマークしたため、JSON オブジェクトが変更されました。」

「こうやってカスタマイズできるのは良いですね。きっと便利だと思いますよ。」

「そして、逆シリアル化は、これをどのように扱うか理解するでしょうか? JSON から Java オブジェクトに逆シリアル化するとき、エイリアス フィールドの値は Cat オブジェクトの名前フィールドに書き込まれますか?」

「はい、デシリアライゼーションは正常に機能します。これは賢明です。」

「それでは何が嬉しくないのか。」

「興味深いレッスンをありがとう、エリー。」