読者です 読者をやめる 読者になる 読者になる

Retrofit2でどうにかJSONを取得するの巻

プログラミング

今回はプログラミングについて書く。とりあえずAndroidJSONを取得したい時にRetrofit使えばどうにかなるらしいよ、という話。

とりあえずここのAPIを使ってみる。
APIリファレンス - connpass

んで、ここにアクセスしてみると、
http://connpass.com/api/v1/event/ f:id:mk2481:20160815000235p:plain
こんな感じになる。よくわからないけど、HTMLが含まれているのでエスケープ文字とかがあるんだろうか。

それをここにコピペして右は各自いじって欲しい。
今回は、 Class Nameはjson Source typeはJSON
Annotation styleはGson
にする。 入力したら下のZipを押すとデータクラスが出来上がる。
http://www.jsonschema2pojo.org/
・・・のだが、長過ぎると出来ないので、検索結果を1つにしてやる。

クエリの使い方は先程のリファレンスを参照。

そしたらModule:appの方のbuild.gradleのdependenciesに以下を追加する。

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.4'
compile 'org.glassfish:javax.annotation:10.0-b28'

パーミッションも追加

    <uses-permission android:name="android.permission.INTERNET"/>

できたらMainActivityがあるらへんにさっきのZipを解凍してデータクラスをコピペする。
次に、APIを叩くインターフェースを作る。

public interface Api {
    @GET("/api/v1/event")
    Call<Json> getJson();
}

解説は後ほどする。

最後に、MainActivityいじって終わり。

public class MainActivity extends AppCompatActivity implements Callback<Json> {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final String URL = "http://connpass.com/";
        Gson gson = new GsonBuilder().setLenient().create();
        Retrofit retrofit = new Retrofit.Builder().
                baseUrl(URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        Api api = retrofit.create(Api.class);
        Call<Json> call = api.getJson();
        call.enqueue(this);
    }

    @Override
    public void onResponse(Call<Json> call, Response<Json> response) {
        if (response.code() == 200){

            List<Event> events = response.body().getEvents();

            for (Event e:events){
                System.out.println(e.getTitle());
            }
        }
    }

    @Override
    public void onFailure(Call<Json> call, Throwable t) {
        Toast.makeText(getApplicationContext(),t.getMessage(),Toast.LENGTH_SHORT).show();
        t.printStackTrace();
    }
}

結果

f:id:mk2481:20160815005401p:plain 長くなったので解説は別記事にする。

mk2481.hatenablog.com

ソース全文はこちら

https://github.com/mk2481/jsonSample/tree/master