LoginSignup
10
11

More than 5 years have passed since last update.

Moshi〜Json変換ライブラリ〜

Last updated at Posted at 2017-09-20

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クラスの配列が取得できます

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11