javaでjsonを扱うことがあったので、ライブラリを探していたら教えてもらいましたので、使い方を
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
注意点として、使用できるクラスが限られるということです
ArrayList
・HashMap
等は使用できませんので、List
・Map
を使用しましょう
・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解析するところを省きましたすみません
ついでにもうひとつ
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);
people
にPerson
クラスの配列が取得できます