1. 序章

このチュートリアルでは、OkHttpを使用しながらJSON応答をデコードするためのいくつかの手法について説明します。

2. OkHttp応答

OkHttpは、GZIPの透過的な処理、応答のキャッシュ、ネットワークの問題からの回復などの機能を備えたJavaおよびAndroid用のHTTPクライアントです。

これらの優れた機能にもかかわらず、OkHttpには、JSON、XML、およびその他のコンテンツタイプ用の組み込みのエンコーダー/デコーダーがありません。 ただし、XML / JSONバインディングライブラリを使用してこれらを実装することも、FeignRetrofitなどの高レベルのライブラリを使用することもできます。

JSONデコーダーを実装するには、サービス呼び出しの結果からJSONを抽出する必要があります。 このために、 Responseオブジェクトのbody()メソッドを介して本体にアクセスできます。 ResponseBody クラスには、このデータを抽出するためのいくつかのオプションがあります。

  • byteStream():本文の生のバイトをInputStreamとして公開します。 これはすべての形式で使用できますが、通常はバイナリとファイルに使用されます
  • charStream():テキスト応答がある場合、 charStream()はそのInputStreamReaderでラップし、応答のコンテンツタイプ、または文字セットが応答ヘッダーに設定されていない場合は「UTF-8」。 ただし、 charStream()を使用する場合、Readerのエンコーディングを変更することはできません。
  • string():応答本文全体をStringとして返します。 charStream()と同じようにエンコーディングを管理しますが、別のエンコーディングが必要な場合は、代わりに source()。readString(charset)を使用できます。

この記事では、応答が小さく、メモリやパフォーマンスの問題がないため、 string()を使用します。 byteStream()および charStream()メソッドは、パフォーマンスとメモリが重要な場合の実稼働システムでのより適切な選択です。

まず、pom.xmlファイルにokhttpを追加しましょう。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId> 
    <version>3.14.2</version> 
</dependency>

次に、 SimpleEntity をモデル化して、デコーダーをテストします。

public class SimpleEntity {
    protected String name;

    public SimpleEntity(String name) {
        this.name = name;
    }
    
    // no-arg constructor, getters, and setters
}

次に、テストを開始します。

SimpleEntity sampleResponse = new SimpleEntity("Baeldung");

OkHttpClient client = // build an instance;
MockWebServer server = // build an instance;
Request request = new Request.Builder().url(server.url("...")).build();

3. ResponseBodyをJacksonでデコードします

Jackson は、JSONオブジェクトバインディングで最も人気のあるライブラリの1つです。

jackson-databindをpom.xmlに追加しましょう。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

JacksonのObjectMapperを使用すると、JSONをオブジェクトに変換できます。 したがって、 ObjectMapper.readValue()を使用して応答をデコードできます。

ObjectMapper objectMapper = new ObjectMapper(); 
ResponseBody responseBody = client.newCall(request).execute().body(); 
SimpleEntity entity = objectMapper.readValue(responseBody.string(), SimpleEntity.class);

Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());

4. ResponseBodyをGsonでデコードします

Gson は、JSONをオブジェクトに(またはその逆に)マッピングするためのもう1つの便利なライブラリです。

gsonをpom.xmlファイルに追加しましょう。

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

Gson.fromJson()を使用して応答本文をデコードする方法を見てみましょう。

Gson gson = new Gson(); 
ResponseBody responseBody = client.newCall(request).execute().body();
SimpleEntity entity = gson.fromJson(responseBody.string(), SimpleEntity.class);

Assert.assertNotNull(entity);
Assert.assertEquals(sampleResponse.getName(), entity.getName());

5. 結論

この記事では、JacksonとGsonを使用してOkHttpのJSON応答をデコードするいくつかの方法について説明しました。

完全なサンプルは、GitHubで入手できます。