目次
JSONとは?
JSONとは、JavaScript Object Notationの略で、JavaScriptのオブジェクトの表記法をベースしたデータ記述言語です。
JSONは、自由な構造でデータを持たせることができ、XMLのような開始・終了タグを必要としないため、XMLに比べデータ容量が軽量なのが特徴です。
JavaScriptのオブジェクト表記そのものなので、非同期でJavaScriptと通信を行うWEB APIのデータ形式として、よく採用されています。
JavaでJSONを扱うときはライブラリが便利
JavaでもJSONを扱うことができ、後述するJacksonなどのライブラリを用いることで、少ないコードで簡単にJSONデータを操作できます。
以降の内容で、Jacksonを使ってJavaのクラスをJSONに変換する方法を詳しく紹介します。
JSON構文を少しおさらい
Javaのサンプルコードを紹介する前に、JSONを知らない方のために、JSONの構文を少し紹介します。
すでにJSONの構文を知っている方は、この章は読み飛ばしましょう。
JSONの文法
中括弧 { … } の中に、「”キー名” : “値”」の形式で記述します。
{ "name": "Yamada" }
JSONで扱えるデータ型
JSONで扱えるデータ型は、文字列、数値、真偽、配列、オブジェクトで、各データは次のように記述します。
{ "name": "Yamada", //文字列 "age": 20, //数値 "delete_fjg": false, //真偽 "favorite_food": "apple", "melon", //配列 "address": { "postal_code": "1234567", "city": "Tokyo" } //オブジェクト }
オブジェクトを入れ子にできる
JSONは、オブジェクトを入れ子にできます。以下が、オブジェクトを入れ子にした例で、”location”に、緯度・経度を持つオブジェクトを入れ子にしています。
{ "name": "Yamada", "age": 20, "location": { "lat": 35.681236, "lon": 139.767125 } }
あまりオブジェクトを入れ子にしすぎると、JSONパーサーの解析時間が遅くなったり、場合によっては、入れ子の数の上限によりエラーになることがあります。
オブジェクトの入れ子の数(階層のレベル)は、可読性も考えて、多くても5つ程度にしておくのが良いでしょう。
Jacksonを使ってJavaクラスとJSONの変換
Jackson(ジャクソン)と読みます。
JacksonはJavaでJSONを扱うメジャーなライブラリです。単純なコードでJavaクラス→JSON、JSON→Javaクラスに変換でき、多くの開発プロジェクトで採用されています。
Jacksonをライブラリに追加する
JacksonはJavaの標準APIではなく、外部ライブラリの為、利用するにはライブラリをダウンロードする必要があります。2019年10月時点では、バージョン2.10が最新です。
■ Mavenの場合
Mavenを利用する場合はpom.xmlに以下の依存関係を追加します。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.10.0</version> </dependency>
■ Gradleの場合
Gradleを利用する場合は、build.gradleに以下の依存関係を追加します。
dependencies { // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.0' // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.10.0' }
■ 直接jarファイルをダウンロードする場合
以下の3つのjarファイルをダウンロードして、Javaのプロジェクトに追加します。
jackson-core-x.x.x.jar
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/
jackson-databind-x.x.x.jar
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/
jackson-annotations-x.x.x.jar
http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/
JavaオブジェクトをJSONに変換する
ライブラリを追加したら、さっそく使ってみましょう。まず、JavaオブジェクトをJSONに変換する方法を解説します。
最初に、JSONに変換するJavaのクラスを作成します。
//ユーザクラス public class User { private String id; // ID private String name; // ユーザ名 private int age; // 年齢 public String getId() { return id; } public void setId(String id) { this.id = id; } 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; } }
クラスをJSON文字列に変換する、サンプルコードは以下のようになります。変換にはObjectMapperクラスのwriteValueAsStringメソッドを使用します。
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; public class Sample { public static void main(String[] args) { //ユーザクラスのインスタンスを作成 User user = new User(); user.setId("ID1234"); user.setName("Yamada Tarou"); user.setAge(30); // JSON変換用のクラス ObjectMapper mapper = new ObjectMapper(); try { //JSON文字列に変換 String json = mapper.writeValueAsString(user); System.out.println(json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
上のコードを実行すると、コンソールにUserクラスをJSON文字列に変換したものが出力されます。
▪️ 実行結果
{"id":"ID1234","name":"Yamada Tarou","age":30}
JSON文字列からJavaのオブジェクトに変換する
続いて、JSON文字列 → Javaオブジェクトへ変換する方法を解説します。以下のJSON文字列を、先ほど作成したUserクラスに変換します。
{"id":"ID_9999","name":"山田 花子","age":20}
public static void main(String[] args) { //JSON変換用のクラス ObjectMapper mapper = new ObjectMapper(); //Userクラスに変換するJSON文字列 String json = "{\"id\":\"ID_9999\",\"name\":\"山田 花子\",\"age\":20}"; try { User user = mapper.readValue(json, User.class); System.out.println("id=" + user.getId()); System.out.println("name=" + user.getName()); System.out.println("age=" + user.getAge()); } catch (JsonProcessingException e) { e.printStackTrace(); } }
▪️ 実行結果
id=ID_9999
name=山田 花子
age=20
Jackson以外のJSONライブラリ
Jackson以外にも、Javaで使えるJSONライブラリには、次のものがあります。GsonはGoogleが開発したJSONライブラリで、Androidアプリの開発でよく用いられています。
- Gson (https://github.com/google/gson)
- JSON in Java (http://stleary.github.io/JSON-java/)
- JSON-P (JSON Processing、JSR 353の実装、https://javaee.github.io/jsonp/)
Java標準のAPIでもJSONを扱うことはできますが、ライブラリを使う方が便利です。