nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

AndroidでGsonを使ってJSONデータをシンプルに扱う

Gson とは

Android で JSON データの呼び出し

  • assets に "sample.json" として JSON データを保存
{
    first_name: taro,
    last_name: yamada,
    favorite: {
        music: pops,
        book: novels,
    },
    histories: [
        { date: "1980-01-01", desc: "Birthed." },
        { date: "1986-04-01", desc: "Elementary school entrance." },
    ],
}
  • Activity で JSON データを InputStream として呼び出し
    InputStream inputStream = getAssets().open("sample.json");

Gson で JSON データをオブジェクトに変換

  • 変換先のオブジェクトのクラスを宣言する
  • JSON データのキー名と、オブジェクトのプロパティ名が対応するように
    public class User {
        public String first_name;
        public String last_name;
        public HashMap<String, String> favorite;
        public ArrayList<HashMap<String, String>> histories;
    }
  • JSON データをオブジェクトに変換
    // JSON データを assets から取得
    InputStream inputStream = getAssets().open("sample.json");
    // JSON データをオブジェクトに変換
    JsonReader jsonReader = new JsonReader( new InputStreamReader( inputStream ) );
    User user = new Gson().fromJson(jsonReader, User.class);
    // オブジェクトの中身確認
    Log.d("GSON_TEST", user.first_name);                   //=> taro
    Log.d("GSON_TEST", user.last_name);                    //=> yamada
    Log.d("GSON_TEST", user.favorite.get("music"));        //=> pops
    Log.d("GSON_TEST", user.favorite.get("book"));         //=> novels
    Log.d("GSON_TEST", user.histories.get(0).get("date")); //=> 1980-01-01
    Log.d("GSON_TEST", user.histories.get(0).get("desc")); //=> Birthed.
    Log.d("GSON_TEST", user.histories.get(1).get("date")); //=> 1986-04-01
    Log.d("GSON_TEST", user.histories.get(1).get("desc")); //=> Elementary school entrance.

感想

  • シンプル!カワイイ!

(追記)オブジェクトをネストさせる

  • 変換先のクラスをネストさせてもプロパティ名とキー名を対応付けてオブジェクトを作ってくれる
  • HashMap で定義していた histories を、History クラスを新たに作って関連付ける
    public class User {
        public String first_name;
        public String last_name;
        public HashMap<String,String> favorite;
        // クラスをネストさせる
        // public ArrayList<HashMap<String, String>> histories;
        public ArrayList<History> histories;
    }
    
    // ネストしたクラス
    public class History {
        public String date;
        public String desc;
    }
    
    JsonReader jsonReader = new JsonReader( new InputStreamReader( getAssets().open("sample.json") ) );
    User user = new Gson().fromJson(jsonReader, User.class);
    
    // UserオブジェクトのプロパティとしてHistoryオブジェクトが作られプロパティにアクセスできる
    Log.d("GSON_TEST", user.histories.get(0).date); //=> 1980-01-01
    Log.d("GSON_TEST", user.histories.get(0).desc); //=> Birthed.
    Log.d("GSON_TEST", user.histories.get(1).date); //=> 1986-04-01
    Log.d("GSON_TEST", user.histories.get(1).desc); //=> Elementary school entrance.