OkHttp JSONレスポンスをデコードする

1. 前書き

このチュートリアルでは、https://www.baeldung.com/guide-to-okhttp [OkHttp]を使用しながら、JSON応答をデコードするためのいくつかの手法を検討します。

2. OkHttp Response

OkHttpは、GZIPの透過的な処理、応答キャッシュ、ネットワーク問題からの回復などの機能を備えたJavaおよびAndroid用のHTTPクライアントです。
これらの優れた機能にもかかわらず、OkHttpにはJSON、XML、およびその他のコンテンツタイプ用の組み込みエンコーダー/デコーダーがありません。 ただし、XML / JSONバインディングライブラリを使用してこれらを実装することも、https://www.baeldung.com/intro-to-feign [Feign]やhttps:// wwwなどの高レベルライブラリを使用することもできます。 baeldung.com/retrofit [レトロフィット]。
JSONデコーダーを実装するには、サービス呼び出しの結果からJSONを抽出する必要があります。 このために、_the Response_オブジェクトの_body()_メソッドを介して本文にアクセスできます。 _ResponseBody_クラスには、このデータを抽出するためのいくつかのオプションがあります。
  • _ * byteStream()* :本体の生のバイトを
    _InputStream
    ;これはすべての形式に使用できますが、通常はバイナリとファイルに使用されます

  • _ * charStream()* _:テキスト応答がある場合、_charStream()_はラップします
    _Reader_内の_InputStream_で、応答のコンテンツタイプに応じてエンコードを処理します。応答ヘッダーに文字セットが設定されていない場合は「UTF-8」。ただし、_charStream()_を使用する場合は、_Reader_のエンコードを変更できません。

  • _ * string()* :応答本文全体を_String_として返します。管理する
    エンコーディングは_charStream()_と同じですが、異なるエンコーディングが必要な場合は、代わりに* _source()。readString(charset)
    *を使用できます

    この記事では、応答が小さく、メモリやパフォーマンスの問題がないため、_string()_を使用します。 _byteStream()_および_charStream()_メソッドは、パフォーマンスとメモリが重要な実稼働システムでのより適切な選択です。
    まず、https://search.maven.org/search?q = g:com.squareup.okhttp3%20a:okhttp [okhttp]をpom.xmlファイルに追加します。
<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. Jacksonで_ResponseBody_をデコードします

link:/jackson[Jackson]は、JSON-Objectバインディングで最も人気のあるライブラリの1つです。
https://search.maven.org/search?q=g:com.fasterxml.jackson.core%20a:jackson-databind[jackson-databind]をpom.xmlに追加しましょう。
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</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. Gsonで_ResponseBody_をデコードする

link:/gson-deserialization-guide[Gson]は、JSONをオブジェクトに、またはその逆にマッピングするためのもう1つの便利なライブラリです。
https://search.maven.org/search?q=g:com.google.code.gson%20a:gson[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. 結論

この記事では、OkHttpのJSON応答をJacksonとGsonでデコードするいくつかの方法を検討しました。
完全なサンプルは、https://github.com/eugenp/tutorials/tree/master/libraries-2 [GitHub上]で入手できます。