Java
JSON

Moshi〜Json変換ライブラリ〜

javaでjsonを扱うことがあったので、ライブラリを探していたら教えてもらいましたので、使い方を:sunglasses:

Moshiとは

GitHub
squareさんがGitHubに公開しているライブラリです

JSONをクラスにparseしてくれたり、逆にクラスをJSONにserializeしてくれます
使い方も簡単です。

Usage

Gradle

compile 'com.squareup.moshi:moshi:1.5.0'

を追加するだけです

Parse

parseするクラスを作成します

class PersonList {
    Map<String, Person> list;
}

class Person {
    int age;
    Sex sex;
}

enum Sex {
    MAN,
    WOMAN
}

parseする部分はこちら

String json = "xxxxxxx";

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

try {
    PersonList personList = jsonAdapter.fromJson(json);
} catch (Exception e) {
    Log.e("json parse error", "parsePersonList: ", e);
}

これだけです(笑)

Serialize

serializeする部分はこちら

PersonList list = /* 作成 */

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

try {
   String json = jsonAdapter.toJson(list);
} catch (Exception e) {
    Log.e("json serialize error", "serializePersonList: ", e);
}

ほとんど一緒ですが、 fromJson()toJson()が変わってます

Caution

注意点として、使用できるクラスが限られるということです
ArrayListHashMap等は使用できませんので、ListMapを使用しましょう

・Primitives (int, float, char...) and their boxed counterparts (Integer, Float, Character...).
・Arrays, Collections, Lists, Sets, and Maps
・Strings
・Enums

CustomAdapter

class PersonAdapter {
    @ToJson String toJson(Person person) {
      return String.valueOf(person.age) + sex.suit.name().substring(0, 1);
    }

    @FromJson Person fromJson(String json) {
        return // Stringを解析してPersonクラス作成
    }
}

String解析するところを省きましたすみません:sob:

ついでにもうひとつ

class ForthPerson {
    int forthAge;
    Sex sex;
}

このような一般人の4倍の年齢の人のクラスがあった場合(笑)、parseの時に変換することができます

class ForthPersonAdapter {
  @FromJson ForthPerson fromJson(Person person) {
    ForthPerson forthPerson = new ForthPerson();
    forthPerson.age = person.age * 4;
    forthPerson.sex = person.sex;
    return forthPerson;
  }

  @ToJson Person toJson(ForthPerson forthPerson) {
    Person person = new Person();
    person.age = forthPerson.age / 4;
    person.sex = forthPerson.sex;
    return person;
  }
}
Moshi moshi = new Moshi.builder()
        .add(new ForthPersonAdapter())
        .build();

これで使えます!

Get List

クラスの配列も取得することができます

String json = "xxxxxxx";

Type type = Types.newParameterizedType(List.class, Person.class);
JsonAdapter<List<Person>> adapter = moshi.adapter(type);
List<Person> people = adapter.fromJson(json);

peoplePersonクラスの配列が取得できます