覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Gson で JSONICの簡単なアダプタを作る

JavaでもJSONを扱わなければならなくなった初期の頃に、JSONICというライブラリのお世話になった方も少なく無いのでは無いでしょうか?

今となっては、jacksonGson 等の他のライブラリを使うのが一般的になっています。


JSONICのページにも以下のように書かれていました。

2018/7/1 JSONIC は、リポジトリを GitHub に移動するとともに今後機能強化が行われることがないメンテナンスモードに移行します。
機能、パフォーマンス共に優れた jackson への移行をおすすめいたします。

なんだか時代を感じます。

というわけで、JSONICを利用しているコードは基本的に、jacksonGson を利用するプログラムに書き換えた方がいいでしょう。

が、そういったプログラム改修が面倒だという場合は、アダプタを作るのも一つのやり方かもしれません。

今回は、JSONICのライブラリを利用していたコードをそのままに、Gsonで処理させるようにしてみます。

log4jのクラスを利用しているコードをのままで、slf4j で処理を実行する log4j-over-slf4j みたいなイメージです。


と言っても、今回はものすごく単純なサンプルですので、JSONICの機能を使い倒していればいるほど動かないと思います。


今回JSON文字列から変換するオブジェクトは以下とします。

import java.util.Arrays;

public final class Person {

    private String name;

    private int age;

    private String[] hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hobby=" + Arrays.toString(hobby) +
                '}';
    }
}


JSONICの動きの確認

まず、JSONIC の動きの確認のためにpom.xmlにJSONICライブラリを追記します

<dependency>
        <groupId>net.arnx</groupId>
        <artifactId>jsonic</artifactId>
        <version>1.3.10</version>
</dependency>


実行のためのサンプルコードは以下の通りです。以下2つの処理を行っています

  • Pesonのインスタンスを生成して、JSON文字列化 (encode)
  • JSON文字列からPesonのインスタンス生成 (decode)

■サンプルコード

import net.arnx.jsonic.JSON;

public class JSONICTrial {

    public static void main(String[] args) {
        Person p = new Person();
        p.setName("taro");
        p.setAge(10);
        p.setHobby(new String[] {"Reading", "Travel"});

        // オブジェクトからJSON文字列へ変換
        String json = JSON.encode(p);
        System.out.printf("%s -> >>encode>> -> %s\n\n", p, json);


        // JSON文字列からオブジェクトへ変換
        Person p2 = JSON.decode(json, Person.class);
        System.out.printf("%s -> >>decode>> -> %s\n\n", json, p2);
    }
}


実行結果は以下の通りです。

■実行結果

Person{name='taro', age=10, hobby=[Reading, Travel]} -> >>encode>> -> {"age":10,"hobby":["Reading","Travel"],"name":"taro"}

{"age":10,"hobby":["Reading","Travel"],"name":"taro"} -> >>decode>> -> Person{name='taro', age=10, hobby=[Reading, Travel]}


JSONICのアダプタと動きの確認

JSONICを利用したコードをGson で処理させるために、pom.xmlにGsonの依存関係を追記します

<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.5</version>
</dependency>

その上で、pom.xmlからJSONICライブラリの記述を除外します


JSONICを利用したコードをGson で処理させるために以下のコードを記述します

package net.arnx.jsonic;

import com.google.gson.Gson;

public final class JSON {
    private static final Gson gson = new Gson();

    public static String encode(Object o) {
        System.out.println("aaaa");
        return gson.toJson(o);
    }

    public static <T> T decode(String json, Class<T> type) {
        return gson.fromJson(json, type);
    }
}


この状態で元のJSONICTrialを実行すると以下のようになります。

■実行結果

Person{name='taro', age=10, hobby=[Reading, Travel]} -> >>encode>> -> {"name":"taro","age":10,"hobby":["Reading","Travel"]}

{"name":"taro","age":10,"hobby":["Reading","Travel"]} -> >>decode>> -> Person{name='taro', age=10, hobby=[Reading, Travel]}

JSON文字列の項目の並び順が微妙に違っていますが、基本的に同じ結果が得られています。


まとめ

今回は、JSONICの超基本的なAPIのみをアダプタとして作成しましたが、それにより一応元のプログラムは改修なしでGsonで処理させて動作することがわかりました。



関連リンク