JavaでJSONをXMLに変換:GsonとJAXBを使ったステップバイステップガイド
JSONとは
JSON(JavaScript Object Notation)は、キーと値のペアを用いた軽量で言語非依存のデータ形式です。データ交換に広く採用されており、ファイルやデータベースへの格納も容易です。
{ "username": "guru99user", "email": "guru99user@mail.com" }
主な特徴:
- 中括弧 {} で囲まれる
- キーと文字列値はダブルクォートで囲む
- ペアはカンマで区切る
- キーには英数字とアンダースコアが使用可能(先頭に数字やスペースは不可)
XMLとは
XML(eXtensible Markup Language)は、W3C標準の構造化データ形式です。HTMLとは異なり、XMLは純粋なデータ形式であり、視覚的なレンダリングは行いません。カスタムタグを定義できるため、システム間のデータ交換に最適です。
典型的なノード構造:
<node>content</node>
XMLファイルの先頭にはバージョン宣言が必要です:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Gsonとは
Gsonは、JavaオブジェクトをJSONにシリアライズし、JSONをJavaオブジェクトにデシリアライズするJavaライブラリです。v1.6以降はJsonReaderとJsonWriterによるストリーミングもサポートしています。
ストリーミングライターの例:
JsonWriter writer = new JsonWriter(new FileWriter(filePath));
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
writer.close();
JAXBとは
JAXB(Java Architecture for XML Binding)は、アノテーションを用いてJavaクラスをXMLにマッピングします。マーシャリング(Java → XML)とアンマーシャリング(XML → Java)の両方をサポートします。
よく使われるアノテーション:
@XmlRootElement– ルートXML要素を定義@XmlElementWrapper– コレクションをラップ@XmlElement– フィールドをXML要素にマッピング@XmlAttribute– フィールドをXML属性にマッピング
プロジェクトのセットアップ
- IDE(Eclipseなど)でJavaプロジェクトを作成
- プロジェクト名をXmlToJsonExampleとする
data/inputフォルダを作成し、sample.xmlとsample.jsonを配置- Gson 2.8.5をビルドパスに追加
- JAXB APIを追加(通常Java 8にバンドル済み)
サンプルデータ
役割と人物を持つ部門のXML表現:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root> <department> <roles> <role id="1"> <position>head</position> <salary>10k</salary> </role> <role id="2"> <position>manager</position> <salary>8k</salary> </role> <role id="3"> <position>employee</position> <salary>5k</salary> </role> </roles> <persons> <person id="1"> <name>Red</name> <role>1</role> </person> <person id="2"> <name>Green</name> <role>2</role> </person> <person id="3"> <name>Blue</name> <role>2</role> </person> <person id="4"> <name>Yellow</name> <role>3</role> </person> <person id="5"> <name>Brown</name> <role>3</role> </person> </persons> </department> </root>
同等のJSON構造:
{ "roles": [ {"id":"1","position":"head","salary":"10k","persons":[{"id":"1","name":"Red"}]}, {"id":"2","position":"manager","salary":"8k","persons":[{"id":"2","name":"Green"},{"id":"3","name":"Blue"}]}, {"id":"3","position":"employee","salary":"5k","persons":[{"id":"4","name":"Yellow"},{"id":"5","name":"Brown"}]} ] }
Javaモデルクラス
modelパッケージに以下のPOJOを定義:
/* Role.java */
@XmlRootElement(name = "role")
public class Role {
private String id, position, salary;
// @XmlAttribute/@XmlElementアノテーション付きのゲッター/セッター
}
/* Person.java */
@XmlRootElement(name = "person")
public class Person {
private String id, name, role;
// @XmlAttribute/@XmlElementアノテーション付きのゲッター/セッター
}
/* Department.java */
@XmlRootElement(name = "department")
public class Department {
private List<Role> roles;
private List<Person> persons;
// @XmlElementWrapper/@XmlElement付きのゲッター/セッター
}
/* XMLModel.java */
@XmlRootElement(name = "root")
public class XMLModel {
private Department department;
// @XmlElement付きのゲッター/セッター
}
XMLからJavaオブジェクトへのアンマーシャリング(JAXB)
public XMLModel getObjectFromXmlFile(String path) throws JAXBException {
File file = new File(path);
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Unmarshaller um = ctx.createUnmarshaller();
return (XMLModel) um.unmarshal(file);
}
JavaオブジェクトからXMLへのマーシャリング(JAXB)
public void parseObjectToXml(String path, XMLModel model) throws JAXBException, IOException {
JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
Marshaller m = ctx.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(model, new FileOutputStream(path));
}
JavaオブジェクトからJSONへのシリアライズ(Gson)
public void writeDataToJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonWriter writer = new JsonWriter(new FileWriter(path));
writer.setIndent(" ");
writer.beginObject();
writer.name("roles").beginArray();
for (Role r : roles) {
writer.beginObject();
writer.name("id").value(r.getId());
writer.name("position").value(r.getPosition());
writer.name("salary").value(r.getSalary());
writer.name("persons").beginArray();
for (Person p : persons)
if (p.getRole().equals(r.getId())) {
writer.beginObject();
writer.name("id").value(p.getId());
writer.name("name").value(p.getName());
writer.endObject();
}
writer.endArray();
writer.endObject();
}
writer.endArray();
writer.endObject();
writer.close();
}
JSONからJavaオブジェクトへのデシリアライズ(Gson)
public void getDataFromJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
JsonReader reader = new JsonReader(new FileReader(path));
reader.beginObject();
while (reader.hasNext()) {
String rootName = reader.nextName();
if ("roles".equals(rootName)) {
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Role r = new Role();
while (reader.hasNext()) {
String key = reader.nextName();
switch (key) {
case "id": r.setId(reader.nextString()); break;
case "position": r.setPosition(reader.nextString()); break;
case "salary": r.setSalary(reader.nextString()); break;
case "persons":
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
Person p = new Person();
p.setRole(r.getId());
while (reader.hasNext()) {
String pKey = reader.nextName();
if ("id".equals(pKey)) p.setId(reader.nextString());
else if ("name".equals(pKey)) p.setName(reader.nextString());
}
persons.add(p);
reader.endObject();
}
reader.endArray();
}
}
roles.add(r);
reader.endObject();
}
reader.endArray();
}
}
reader.endObject();
reader.close();
}
完全な変換ワークフロー
- JAXBを使って
sample.xmlをXMLModelにアンマーシャリング - Gsonを使ってJavaオブジェクトを
sample.jsonにシリアライズ sample.jsonをJavaオブジェクトにデシリアライズ- それらのオブジェクトを新しいXMLファイルにマーシャリング
まとめ
このガイドでは、JAXBでXML⇔Java、GsonでJSON⇔Javaを処理するクリーンな2ステップの変換パイプラインを紹介しました。これらのライブラリを組み合わせることで、Javaアプリケーションでデータ形式間の信頼性の高い変換が可能になります。
Java
- C++クラスとオブジェクト:コード例付き実践ガイド
- Java Hello World:最初のJavaプログラム作成ステップバイステップガイド
- Javaカプセル化完全ガイド:実践例で理解するデータ隠蔽とアクセサ
- Java String.length()メソッド:文字列サイズ取得の実例解説
- Java String.charAt()完全解説:構文、戻り値、例外、実例
- Java String.contains()メソッド:部分文字列チェックの実践例
- Java String.endsWith()マスター:文字列サフィックスチェック実例付き
- Java BufferedReader でファイル読み込み:実践ガイドと例
- Javaでフィボナッチ数列を生成:for文、while文、再帰の実装例
- Javaで挿入ソート:わかりやすい例とステップバイステップガイド
- Javaで選択ソート:ステップバイステップ例と完全コード