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'
Gradleのdependencesの中

これで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フォルダを作成

File→New→Folder→Assets Folder

mainを選択してFinish

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を見てわかるようにtestsdata4は階層が深くなっています。階層が深くなってしまった場合その階層に対するクラスが必要になります

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;

}