Android StudioでGsonを使う
今回の目的はAndroid Studio内でJsonをパースすること。
Gsonライブラリを使用してJsonのパースを行う。
Gsonの使い方を調べると詳細に説明をしてくれているサイトはいくつかありますが、Android Studioをある程度知っている前提での解説なので私には難しかったです。なのでJsonをAndroid Studioのプロジェクトに追加するところから説明していきます。
今回使用するjsonファイル
{ "data1": "hoge", "data2": "hufa", "data3": "piyo", "tests": [ { "test1": "aaa ", "test2": "ccc " } ], "data4": { "list1": "あいうえお", "list2": "かきくけこ" } }
Gsonを使うための準備
Android Studioではライブラリを使用する際Gradleの中に「つかうよ」と言う記述が必要でGsonを使う時にもつかうよと記述してあげる必要がある。そのため下記の1行をGradleのdependences内に記述する
implementation 'com.google.code.gson:gson:2.2.4'
これでGsonを使うことができるようになったので、MainActivityに戻ってGsonのインスタンスを作成する。Gradleの変更はのボタンを押して読み込み直さないと適応されずalt+enterを押してもinportしてくれないので注意!
onCreateの中に下記の1行がエラーなく宣言できたらOKです
Gson gson = new Gson();
プロジェクト内にJsonファイルを配置
Android Studio初心者の私はここでかなり苦しみました。初めはrawフォルダの中にjsonファイルを入れて試していたのですがうまくいかず、assertに入れたら成功したのでassetを作成してその中にjsonファイルを入れて行きます。
Android Studioにはファイルを格納できる場所が3つ存在していて、data,src,assetsの3つのフォルダです。この3つのフォルダを自分で作ってmainの下にディレクトリを移動して…と勝手に苦しんでいたのですが、そんなことをする必要はなくassetsフォルダは簡単に作成することはできます。下記を参考にしました
Android StudioでAssetsフォルダを簡単に作成する方法
javaコードから3つのディレクトリ内のファイルにアクセス方法は愚鈍人:ファイルアクセスがわかりやすかったです
assetsフォルダを作成
assetsフォルダが作成できたらドラックアンドドロップでassets内にjsonファイルを入れてください。
これでjsonを使う準備が完了です。
コード
MainActivity
MainActivityのonCreate内に下記のコードを追記します。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Gson gson = new Gson(); InputStream inputStream = null; try { inputStream = this.getAssets().open("sample.json"); } catch (IOException e) { e.printStackTrace(); } //InputStreamReaderで中の文字列を取得 InputStreamReader isr = new InputStreamReader(inputStream); //JsonReaderでjson形式に成形 JsonReader jsr = new JsonReader(isr); //Gsonでパース ParseJson parseJson = new Gson().fromJson(jsr, ParseJson.class); }
inportしていく際に注意しなくてはいけないことがあります。android.utilとgoogle.gsonの中の両方がJsonReaderというクラスを持っています。間違えるとエラーになってしまいます。これがまた何のエラーかわからず困りました…
何も考が得ずにalt+returnで追加していくとandroid.utilの方がinportされてしまうので動きません。android初心者の私はかなり苦しみました。詳しい方にお聞きしたところAndroidで開発する際によくあることだと言ってました。
inport文の中に下記の1行があったら削除してGsonの方を入れ直してみてください
import android.util.JsonReader;
ParseJson
MainActivityのonCreate内最後の行
ParseJson parseJson = new Gson().fromJson(jsr, ParseJson.class);
この行でGsonのfromJsonという関数にjsonの文字列のデータとparseを行うクラスを投げています。クラスないの作りはシンプルでsample.jsomの中の階層ごとに読んでいく感じです。sample.jsonの一番浅い階層にはdata1, data2, data3, tests, data4が存在しているのでメンバ変数を作成してあげるだけです。値を入れる部分はGsonがやってくれます
package com.example.harumi_sagawa.gsonsample_wp; import java.util.ArrayList; import java.util.List; public class ParseJson { public String data1; public String data2; public String data3; public List tests; public Data4 data4; }
sample.jsonを見てわかるようにtestsとdata4は階層が深くなっています。階層が深くなってしまった場合その階層に対するクラスが必要になります
testsから見ていきます。testsは配列でtest1とtest2を持っています
"tests": [ { "test1": "aaa ", "test2": "ccc " } ]
配列はListで宣言をします。
次にdata4ですがこれは単純に階層が深くなっているだけです。その場合はメンバ変数を宣言する際に型を下の階層クラス名で宣言しその中にデータを入れてあげれば入ります.
Testsクラス
package com.example.harumi_sagawa.gsonsample_wp;
public class Tests {
public String test1;
public String test2;
}
Data4クラス
package com.example.harumi_sagawa.gsonsample_wp; public class Data4 { public String list1; public String list2; }