Gson + volley で JSONをパースしてから

なんかやたらみかけます。
HTTPクライアントライブラリの「volley」。

なんかかんたんらしいのでやってみた。
あと、JSONパーサの「Google Gson」てのも使ってね。

JSON

お題的には、無料公開の「Open Weather Map API」ての。

こんなレスポンスを返します。

{"coord":{"lon":139,"lat":35},
 "sys":{"country":"JP","sunrise":1370806166,"sunset":1370858254},
 "weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],
 "base":"global stations",
 "main":{"temp":289.26,"humidity":61,"pressure":1012,"temp_min":289.26,"temp_max":289.26},
 "wind":{"speed":3.91,"deg":105.003},
 "clouds":{"all":88},
 "dt":1370851210,
 "id":1851632,
 "name":"Shuzenji",
 "cod":200}

調べると画像も取得できるのだと。

http://openweathermap.org/img/w/04d.png

OpenWeatherMap JSON API v2.1(Androidからの利用方法メモ)

 

Google Gson

パースは、2行+モデルクラスででける。
https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/src/com/google/gson/examples/android/GsonProguardExampleActivity.java

...
Gson gson = new Gson();
...
sb.append("Cart Object: ").append(gson.fromJson(json, Cart.class)).append("\n");
...

注意するのは以下2点。

一層目に配列が返ってくるときは、Type(コレクション)で。

オブジェクトの中の配列は、List型に入れてくる。

Gsonの使い方(JSONをJava Objectsに変換)
http://eikatou.net/blog/2012/02/gson-deserialize/

モデルクラスをつくるとき、Android Studioなら以下TIPSが使えます。

エディターで⌘N (Code | Generate)を使えば、クラスのフィールドのゲッターとセッターを簡単に生成できます。

AndroidStudioのTip of the Dayを翻訳してたけど途中で飽きた

 

volley

かんたんに非同期で取得。

まずHTTPリクエストを行うQueueを作ります。

mQueue = Volley.newRequestQueue(context);

あとはリクエストを投げます。

request = new JsonObjectRequest(Method.GET, rul, null, 
                   new Listener<JSONObject>() {
                       public void onResponse(JSONObject jsonRoot) {
                           List<Item> items = parseJson(jsonRoot);
                           appendItemToList(items);
                       }
                   });
mQueue.add(request);

Volley(AndroidのHTTP通信ライブラ)を使おう
http://www.adamrocker.com/blog/341/volley-easy-fast-networking-for-android.html

で、ついでにリクエストヘッダとかどうやるのか。

Volleyでhttp headerを追加設定する
http://qiita.com/items/be00bc7f3f7e03d1c4c0

何をするにもシンプルです。

 

gson + volley て

実際、volleyからは、JSONをオブジェクトとして受け取れるよう。

volley

これってパーサーとかいらねんぢゃね?

と思いつつも、volley + gson で github を探すとこんなの。

public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Listener<T> listener;
 
    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
            Listener<T> listener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }
 
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }
 
    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
 
    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}

https://gist.github.com/ficusk/5474673

とかあれこれやってるとこんな。

weather

もっと、画像とか連続HTTPアクセスぢゃないと、あまり良さゎ分からなかったりします。


関連ワード:  Androidアプリツールライブラリ開発