【Android】GsonでJsonを高速にいじろう

GsonとはGoogleが作ったJsonとオブジェクトの変換を高速にやってくれる優秀なライブラリです。

使うメリット

2014年にAndroidで使えるJsonパーサの速度比較をした時には最速でした。
プログラムも書きやすく、パフォーマンスもいいのでオススメです。
Jsonの内容によってどのパーサが早いか変わるので速度重視なら実際のJsonで速度比較するべきです。

使い方

gradleの設定
build.gradleのdependenciesに以下を記載します。

compile 'com.google.code.gson:gson:2.3.1'
<||

<b>ソースコード</b>
Jsonと紐づくモデルを作ります。
>|java|
public class JsonModel {

    @SerializedName("user_name")
    private String userName;
    private int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
<||
javaの変数名はキャメルケースですが、jsonのキー名はスネークケースで書く事が多いと思います。
その場合は@SerializedNameアノテーションでjsonのキー名を指定してあげれば紐づけてくれます。

実際にjsonとモデルを変換しているのが以下のクラスです。
>|java|
public class MainActivity extends Activity {

    @Bind(R.id.edit_json)
    EditText txtJson;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    private JsonModel makeJsonModel() {

        JsonModel model = new JsonModel();

        model.setUserName("TAROH YAMADA");
        model.setAge(93);

        return model;
    }

    @OnClick(R.id.btn_to_json)
    protected void clickToJson(View view) {

        Gson gson = new Gson();
        String json = gson.toJson(makeJsonModel());

        txtJson.setText(json);
    }

    @OnClick(R.id.btn_format_json)
    protected void clickFormatJson(View view) {

        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String json = gson.toJson(makeJsonModel());

        txtJson.setText(json);
    }

    @OnClick(R.id.btn_from_json)
    protected void clickFromJson(View view) {

        String json = txtJson.getText().toString();
        Gson gson = new Gson();
        JsonModel model = null;

        if (json == null || "".equals(json.trim())) {
            Toast.makeText(this, "JSONを入力してください", Toast.LENGTH_SHORT).show();
            return;
        }

        model = gson.fromJson(json, JsonModel.class);
        Toast.makeText(this, "user_name: " + model.getUserName() + " age: " + model.getAge(), Toast.LENGTH_SHORT).show();
    }

    @OnClick(R.id.complexity_to_json)
    protected void clickComplexityToJson(View view) {

        ComplexityModel model = new ComplexityModel();
        JsonModel jsonModel = makeJsonModel();
        List<JsonModel> modelList = makeModelList();
        String json = null;
        Gson gson = new Gson();

        model.setModel(jsonModel);
        model.setModelList(modelList);
        json = gson.toJson(model);

        txtJson.setText(json);
    }

    @OnClick(R.id.complexity_from_json)
    protected void clickComplexityFromJson(View view) {

        Gson gson = new Gson();
        String json = txtJson.getText().toString();
        ComplexityModel model = null;

        if (json == null || "".equals(json.trim())) {
            Toast.makeText(this, "JSONを入力してください", Toast.LENGTH_SHORT).show();
            return;
        }

        model = gson.fromJson(json, ComplexityModel.class);
    }

    private List<JsonModel> makeModelList() {

        List<JsonModel> modelList = new ArrayList<>();

        for (int i=0; i<10; i++) {
            modelList.add(makeJsonModel());
        }

        return modelList;
    }
}
<||

モデルをjson(String文字列)にするには以下です。
>|java|
Gson gson = new Gson();
String json = gson.toJson(makeJsonModel());
<||
※makeJsonModel()メソッドはモデルに値をセットしてるだけです。

逆にjsonをモデルにするのは以下です。
>|java|
Gson gson = new Gson();
JsonModel model = gson.fromJson(json, JsonModel.class);
<||

テストの時や設計書にjsonのサンプルを書く時などに便利な
見やすくフォーマットしてくれたjson文字列にしてくれる方法もあります。
>|java|
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(makeJsonModel());
<||
Gsonのインスタンス生成の方法が変わるだけです。
※でも逆に忘れやすい

階層が深いJsonやArrayを使う場合は以下です。
>|java|
public class ComplexityModel {

    private JsonModel model;
    private List<JsonModel> modelList;

    public JsonModel getModel() {
        return model;
    }

    public void setModel(JsonModel model) {
        this.model = model;
    }

    public List<JsonModel> getModelList() {
        return modelList;
    }

    public void setModelList(List<JsonModel> modelList) {
        this.modelList = modelList;
    }
}
<||

今回のソースコード一式は以下にあります。