工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

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)の両方をサポートします。

よく使われるアノテーション:

プロジェクトのセットアップ

  1. IDE(Eclipseなど)でJavaプロジェクトを作成
  2. プロジェクト名をXmlToJsonExampleとする
  3. data/inputフォルダを作成し、sample.xmlとsample.jsonを配置
  4. Gson 2.8.5をビルドパスに追加
  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();
}

完全な変換ワークフロー

  1. JAXBを使ってsample.xmlをXMLModelにアンマーシャリング
  2. Gsonを使ってJavaオブジェクトをsample.jsonにシリアライズ
  3. sample.jsonをJavaオブジェクトにデシリアライズ
  4. それらのオブジェクトを新しいXMLファイルにマーシャリング

まとめ

このガイドでは、JAXBでXML⇔Java、GsonでJSON⇔Javaを処理するクリーンな2ステップの変換パイプラインを紹介しました。これらのライブラリを組み合わせることで、Javaアプリケーションでデータ形式間の信頼性の高い変換が可能になります。

Java

  1. C++クラスとオブジェクト:コード例付き実践ガイド
  2. Java Hello World:最初のJavaプログラム作成ステップバイステップガイド
  3. Javaカプセル化完全ガイド:実践例で理解するデータ隠蔽とアクセサ
  4. Java String.length()メソッド:文字列サイズ取得の実例解説
  5. Java String.charAt()完全解説:構文、戻り値、例外、実例
  6. Java String.contains()メソッド:部分文字列チェックの実践例
  7. Java String.endsWith()マスター:文字列サフィックスチェック実例付き
  8. Java BufferedReader でファイル読み込み:実践ガイドと例
  9. Javaでフィボナッチ数列を生成:for文、while文、再帰の実装例
  10. Javaで挿入ソート:わかりやすい例とステップバイステップガイド
  11. Javaで選択ソート:ステップバイステップ例と完全コード