1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Volley で Json Object を渡して Json Array を受け取る

Posted at

やりたいこと

リクエストが JSON Object で、レスポンスが JSON Array である API エンドポイントに、Volley でリクエストを投げたい

Volley の Json リクエスト

Volley には、JSON リクエストのメソッドとして以下の 2 つがある

メソッド 説明
JsonObjectRequest JSON Object を渡して、JSON Object 形式のレスポンスを受け取る
JsonArrayRequest JSON Array を渡して、JSON Array 形式のレスポンスを受け取る

このように、リクエストの形式とレスポンスの形式が一致しているメソッドしかない

仮に、上記のやりたいことを、これらのメソッドを使ってみると、

  • JsonObjectRequest

    • リクエストを送ることはでき、レスポンスも返ってくるが、レスポンスが指定の形式じゃなので、Error Response 側の処理が実行される
  • JsonArrayRequest

    • リクエストの形式が不正なので、そもそもリクエストできない

実現方法

調べた限りでは、カスタムリクエストクラスを作るしかなさそう

open class CustomJsonRequest(
        method: Int,
        url: String,
        requestObject: JSONObject,
        responseListener: Response.Listener<JSONArray>,
        errorListener: Response.ErrorListener
): JsonRequest<JSONArray>(method, url, requestObject.toString(), responseListener, errorListener){

    override fun deliverResponse(response: JSONArray) {
        super.deliverResponse(response)
    }

    override fun parseNetworkResponse(response: NetworkResponse): Response<JSONArray> {
        return try {
            val jsonString = String(response.data, Charset.forName(HttpHeaderParser.parseCharset(response.headers)))
            Response.success(JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response))
        } catch (e: JSONException) {
            Response.error(ParseError(e))
        } catch (e: UnsupportedEncodingException) {
            Response.error(ParseError(e))
        }
    }
}

あとは CustomJsonRequest を使って、JsonObjectRequestJsonArrayRequest を使う時と同じように書いてやれば実現できる

終わりに

JSON Object を渡し JSON Array をレスポンスするには、Volley の標準のメソッドは実現できず、自分でカスタムクラスを実装する必要があり思ったより大変でした

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?