JavaでもJSONを扱わなければならなくなった初期の頃に、JSONIC
というライブラリのお世話になった方も少なく無いのでは無いでしょうか?
今となっては、jackson
や Gson
等の他のライブラリを使うのが一般的になっています。
JSONICのページにも以下のように書かれていました。
2018/7/1 JSONIC は、リポジトリを GitHub に移動するとともに今後機能強化が行われることがないメンテナンスモードに移行します。 機能、パフォーマンス共に優れた jackson への移行をおすすめいたします。
なんだか時代を感じます。
というわけで、JSONIC
を利用しているコードは基本的に、jackson
や Gson
を利用するプログラムに書き換えた方がいいでしょう。
が、そういったプログラム改修が面倒だという場合は、アダプタを作るのも一つのやり方かもしれません。
今回は、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) { 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で処理させて動作することがわかりました。