「こんにちは、アミーゴ!」
「こんにちは、エリー!」
「JSON についてはすでに紹介されているので、今日は JSON について詳しく話しましょう。」
「わかりました。普段どこで使われていますか?」
「通常の動作は次のとおりです。誰か (クライアント) が Java プログラム (サーバー) にデータを要求します。プログラムは Java オブジェクトを作成し、データベースからの情報をそれに埋め込みます。次に、それらを要求者 (クライアント) が指定する形式に変換します。 ) JSON などを理解して送り返すことができます。」
「Java で JSON を操作する方法を説明しましょう。基本的に必要なことは 2 つだけです。Java オブジェクトを JSON 形式にシリアル化することと、Java オブジェクトを JSON 形式から逆シリアル化することです。」
「言い換えれば、JSON は、あるプログラムから別のプログラムにメッセージやデータを送信するための標準です。そのような標準はたくさんあります。しかし、プログラムが JavaScript で書かれている場合、通常は JSON を使用しようとします。」
"大丈夫、準備できました。"
「わかりました。それでは始めましょう。」
「すでにご存知のとおり、Java には標準のシリアル化ツールが組み込まれています。しかし、それらは JSON をサポートしていません。したがって、オブジェクトを JSON にシリアル化する必要がある場合は、その方法を知っている一般的なフレームワーク (ライブラリ) の 1 つを使用できます。これを行う。"
「これらの異なるフレームワークの違いは何ですか?」
「通常、それらは複雑さのレベルが異なります。非常に基本的なことしか実行できないフレームワークもありますが、それらは非常に小さくてシンプルです。そして、さらに多くのことを実行できる大規模で複雑なフレームワークもあります。」
「Jackson は最も人気のあるフレームワークの 1 つです。JSON の操作方法を検討する際に、これを例として使用します。」
「まず、このフレームワークをダウンロードしてプロジェクトに追加する必要があります。これは IntelliJ IDEA で直接行う必要があります。このリンクを使用してフレームワークをダウンロードできます。」
"終わり。"
「わかりました。では、続けましょう。」
「Java オブジェクトを JSON に変換するのは、シリアル化するのと同じくらい簡単です。これを行うには、特別な ObjectMapper クラス (com.fasterxml.jackson.databind.ObjectMapper) が必要です。」
「実際の例をお見せして、それを分析してみましょう。」
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);
}
@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 のネイティブ シリアル化ほど難しいものはありません。」
「逆シリアル化はどのようなものになるでしょうか?」
「ほぼ同じですが、短いだけです。」
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);
}
@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 | 授業前に設置。 シリアル化中にフィールドの順序を指定できます。 |
「面白いですね!もっとあるの?」
「たくさんあります。しかし、今はそれらを取り上げません。次に、最初の例を少し作り直してみましょう。」
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);
}
@JsonAutoDetect
class Cat
{
@JsonProperty("alias")
public String name;
public int age;
@JsonIgnore
public int weight;
Cat() {
}
}
{"age":5, "alias":"Missy"}
「コードは同じですが、注釈を変更しました。名前フィールドに別の名前、エイリアスを指定しました。また、重みフィールドを無視としてマークしたため、JSON オブジェクトが変更されました。」
「こうやってカスタマイズできるのは良いですね。きっと便利だと思いますよ。」
「そして、逆シリアル化は、これをどのように扱うか理解するでしょうか? JSON から Java オブジェクトに逆シリアル化するとき、エイリアス フィールドの値は Cat オブジェクトの名前フィールドに書き込まれますか?」
「はい、デシリアライゼーションは正常に機能します。これは賢明です。」
「それでは何が嬉しくないのか。」
「興味深いレッスンをありがとう、エリー。」
GO TO FULL VERSION