基本型→JSONの変換
前回は2回にわたってJavaプログラムでJSONデータを扱うための
Gsonはこのページよりダウンロードすることができます。
Gsonを使う場合に重要なのは、
まずは整数や文字列をJSON形式で出力してみましょう。次のようにGsonインスタンスを生成し、
// Gsonオブジェクトを作成
Gson gson = new Gson();
// 基本型、String、配列からJSONへの変換
System.out.println(gson.toJson(123)); // 「123」と出力
System.out.println(gson.toJson("hello")); // 「"hello"」と出力
int[] numbers = {1, 2, 3};
System.out.println(gson.toJson(numbers)); // 「[1,2,3]」と出力
toJson()メソッドでJSONデータを直接ファイルに出力することもできます。その場合、
// ファイルへの書き出し
try (JsonWriter writer =
new JsonWriter(new BufferedWriter(new FileWriter("output1.json")))) {
gson.toJson(new JsonPrimitive("hello"), writer);
} catch (IOException ex) {
ex.printStackTrace();
}
このコードを実行すると、
"hello"
JSON→基本型の変換
JSON形式のデータをJavaオブジェクトとして読み込むにはfromJson()メソッドを利用します。その場合、
// Gsonオブジェクトを作成
Gson gson = new Gson();
// JSONから基本型、Stringへの変換
int number = gson.fromJson("123", int.class);
System.out.println(number); // 「123」と出力
String text = gson.fromJson("\"hello\"", String.class);
System.out.println(text); // 「hello」と出力
int[] array = gson.fromJson("[1, 2, 3]", int[].class);
System.out.println(array); // 「[x@xxxx」(配列の文字列表現)と出力
ファイルから読み込む場合には、
// ファイルからの読み込み
try (JsonReader reader =
new JsonReader(new BufferedReader(new FileReader("output1.json")))) {
text = gson.fromJson(reader, String.class);
System.out.println(text); // 「hello」と出力
} catch (IOException ex) {
ex.printStackTrace();
}
Javaオブジェクト→JSONの変換
次に、
public class Name {
private String first;
private String last;
public Name(String first, String last) {
this.first = first;
this.last = last;
}
}
public class User {
private Name name;
private String mail;
public User(Name name, String mail) {
this.name = name;
this.mail = mail;
}
@Override
public String toString() {
return "name:\n " + name.getFirst() + "\n " + name.getLast() + "\nmail:\n " + mail;
}
}
この場合も、
// JSONファイルの書き出し
try (JsonWriter writer =
new JsonWriter(new BufferedWriter(new FileWriter("output2.json")))) {
// UserオブジェクトからJSONへの変換
Name name = new Name("技評", "太郎");
User user = new User(name, "taro@example.co.jp");
gson.toJson(user, User.class, writer);
} catch (IOException ex) {
ex.printStackTrace();
}
このコードを実行すると、
{"name":{"first":"技評","last":"太郎"},"mail":"taro@example.co.jp"}
JSON→Javaオブジェクトの変換
続いて今生成したoutput2.
// JSONファイルからの読み込み
try (JsonReader reader =
new JsonReader(new BufferedReader(new FileReader("output2.json")))) {
// JSONからUserオブジェクトへの変換
User user = gson.fromJson(reader, User.class);
System.out.println(user);
} catch (IOException ex) {
ex.printStackTrace();
}
このコードの実行結果は次のようになり、
name:
技評
太郎
mail:
taro@example.co.jp
Collectionオブジェクト→JSONの変換
複数のオブジェクトからなる配列をJSON形式で作成したい場合にはどうしたらいいでしょうか。その場合はCollectionを利用します。たとえば次のコードは、
// JSONファイルの書き出し
try (JsonWriter writer =
new JsonWriter(new BufferedWriter(new FileWriter("output3.json")))) {
// CollectionオブジェクトからJSONへの変換
ArrayList list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
gson.toJson(list, ArrayList.class, writer);
} catch (IOException ex) {
ex.printStackTrace();
}
生成されるoutput3.
[1,2,3]
ArrayListの中身がIntegerではなくUserオブジェクトの場合も同様です。
// JSONファイルの書き出し
try (JsonWriter writer =
new JsonWriter(new BufferedWriter(new FileWriter("output4.json")))) {
// 複数のUserからなるCollectionの生成
Name name1 = new Name("技評", "太郎");
User user1 = new User(name1, "taro@example.co.jp");
Name name2 = new Name("技術", "次郎");
User user2 = new User(name2, "jiro@example.co.jp");
ArrayList userList = new ArrayList();
userList.add(user1);
userList.add(user2);
// Userを含むCollectionオブジェクトからJSONへの変換
gson.toJson(userList, ArrayList.class, writer);
} catch (IOException ex) {
ex.printStackTrace();
}
この場合、
[
{
"name":{"first":"技評","last":"太郎"},
"mail":"taro@example.co.jp"
},
{
"name":{"first":"技術","last":"次郎"},
"mail":"jiro@example.co.jp"
}
]
JSON→Collectionオブジェクトの変換
最後に、
得られたTypeインスタンスを次の例のようにfromJson()に渡すことで、
// JSONファイルからの読み込み
try (JsonReader reader =
new JsonReader(new BufferedReader(new FileReader("output3.json")))) {
// JSONからCollectionオブジェクトへの変換
Type type = new TypeToken>(){}.getType();
ArrayList list = gson.fromJson(reader, type);
for (Integer i: list) {
System.out.println(i);
}
} catch (IOException ex) {
ex.printStackTrace();
}
このコードの実行結果は次のようになります。配列の要素が個別にIntegerとしてArrayListに格納されていることがわかります。
1
2
3
output4.
// JSONファイルからの読み込み
try (JsonReader reader =
new JsonReader(new BufferedReader(new FileReader("output4.json")))) {
// JSONからCollectionオブジェクトへの変換
Type type = new TypeToken>(){}.getType();
ArrayList list = gson.fromJson(reader, type);
for (User user: list) {
System.out.println(user);
}
} catch (IOException ex) {
ex.printStackTrace();
}
このコードの実行結果は次のようになります。配列の要素になっているオブジェクトも、
name:
技評
太郎
mail:
taro@example.co.jp
name:
技術
次郎
mail:
jiro@example.co.jp
このように、