さまよえる、Android

Androidのプログラミングで便利なことや残しておきたいことを残しておく。もしオススメのライブラリがあったら教えてくださいね。

JSONライブラリー、Moshiを使ってみた。

http://www.flickr.com/photos/32184125@N00/5052051896
photo by uvince

AndroidJSONをパースするのに、AndroidJSONライブラリを調べていた。

もっしー?、Moshi 、modern JSON library

生まれて一度もSquareのクレジット決済を利用したことはないけど

Androidのアプリ開発する際、オープンソースのライブラリで、よくお世話になってます。

今回見つけたライブラリも、Square製だった。

AndroidJSON系ライブラリてGSON、Jacksonとか、強そうな名前が多い。

ゆるカワなMoshi。

でもさ、Moshiの記事が見当たらない。

そんなMoshiが、Dang Dang気になってきた。


美味しんぼ 「Dang Dang気になる」 - YouTube

いつもの

    compile 'com.squareup.moshi:moshi:1.0.0'

Moshiは、JSON形式のデータを読み込んで、JavaObjectに変換してくれる、モダンで軽量なライブラリ。

JSONファイル

{
  "hidden_card": {
    "rank": "6",
    "suit": "SPADES"
  },
  "visible_cards": [
    {
      "rank": "4",
      "suit": "CLUBS"
    },
    {
      "rank": "A",
      "suit": "HEARTS"
    }
  ]
}

構造

hidden_card(単数)
    rank
    suit

visible_cards(複数)
    rank
    suit

    rank
    suit

JSONの構造に合わせてクラスを作る。

class BlackjackHand {
  public final Card hidden_card;
  public final List<Card> visible_cards;
  ...
}

class Card {
  public final char rank;
  public final Suit suit;
  ...
}

enum Suit {
  CLUBS, DIAMONDS, HEARTS, SPADES;
}

JSONを読み込んでJavaObjectに変換する。

String json = ...;

Moshi moshi = new Moshi.Builder().build();
JsonAdapter<BlackjackHand> jsonAdapter = moshi.adapter(BlackjackHand.class);

BlackjackHand blackjackHand = jsonAdapter.fromJson(json);
System.out.println(blackjackHand);

ピンとこない。

Githubの説明を読んでも、ブラックジャックがよくわからない。
とりあえず、JSONの構造にあったクラスを作ればいいんだね。

個人(名前、年齢、仕事)

Json

 String json_str = ""
                + "{\n"
                + "    \"person\": {\n"
                + "        \"name\": \"香川健二\",\n"
                + "        \"age\": \"30\",\n"
                + "        \"job\": \"エンジニア\"\n"
                + "     }\n"
                + "}\n";

Personクラスを作る。

class Person {
    String name;
    String job;
    int age;
    Person(String name, String job, int age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }
}

Personクラスを保持するクラス。

public class JsonCreate  {
    Person person;
    JsonCreate(Person person) {
        this.person = person;
    }
}

JSONを読み込んで出力。

try {
    Moshi moshi = new Moshi.Builder().build();
    JsonAdapter<JsonCreate> jsonAdapter = moshi.adapter(JsonCreate.class);
    JsonCreate json = jsonAdapter.fromJson(json_str);
    Log.d("デバッグ",""
         + "名前 : " + json.person.name + "\n"
         + "年齢 : " + json.person.age + "\n"
         + "仕事 : " + json.person.job
    );
} catch (IOException e) {
    Log.d("デバッグ",e.toString());
}

個人 ( 名前、年齢、仕事 ) + 会社 ( ( 名前、年齢、仕事 )... )

Json

    String json_str = ""
                + "{\n"
                + "    \"person\": {\n"
                + "        \"name\": \"香川 健二\",\n"
                + "        \"age\": \"30\",\n"
                + "        \"job\": \"エンジニア\"\n"
                + "     },\n"
                + "     \"campany\": [\n"
                + "         {\n"
                + "             \"name\": \"田中 誠\",\n"
                + "             \"age\": \"24\",\n"
                + "             \"job\": \"デザイナ\"\n"
                + "         },\n"
                + "         {\n"
                + "             \"name\": \"木村 忍\",\n"
                + "             \"age\": \"34\",\n"
                + "             \"job\": \"エンジニア\"\n"
                + "         }\n"
                + "     ]\n"
                + "}\n";

Personクラスを保持するクラス。

public class JsonCreate  {
    Person person;
    List<Person> campany;

    JsonCreate(Person person, List<Person> campany) {
        this.person = person;
        this.campany = campany;
    }
}

JSONを読み込んで出力。

try {
    Moshi moshi = new Moshi.Builder().build();
    JsonAdapter<JsonCreate> jsonAdapter = moshi.adapter(JsonCreate.class);
    JsonCreate json = jsonAdapter.fromJson(json_str);

    Log.d("デバッグ",""
        + "名前 : " + json.person.name + "\n"
        + "年齢 : " + json.person.age + "\n"
        + "仕事 : " + json.person.job
    );

    for(int i = 0; i < json.campany.size(); i++) {
        Log.d("デバッグ",""
            + "名前 : " + json.campany.get(i).name + "\n"
            + "年齢 : " + json.campany.get(i).age + "\n"
            + "仕事 : " + json.campany.get(i).job
        );
     }
} catch (IOException e) {
    Log.d("デバッグ",e.toString());
}