Gson と JAXB を使用して JSON を XML Java に変換する例

JSONとは何ですか?

JSON は Javascript Object Notation の略称で、現在ほとんどのプログラミング言語が読み取り可能な一定の規則に従ったデータ形式です。 ファイルに保存したり、データベースに記録したりすることが簡単にできます。 JSON 形式は、キーと値のペアを使用してデータを記述します。

続いてwing この例では、個人情報を保存する JSON 文字列を定義します。

{
"username" : "guru99user",
"email" : "guru99user@mail.com"	
}

したがって、JSON の構文は非常に単純です。 各データ情報には、特定のレコードのフィールド名とその値に対応するキーと値の XNUMX つの部分があります。 しかし、さらに詳しく見てみると、次のようなことがいくつかあります。

  • JSON 文字列は中括弧 {} で囲まれます。
  • JSON のキーと値は引用符 {"} で囲む必要があります。
  • さらに多くのデータがある場合 (キー => 値のペアが多い場合)、カンマ (,) を使用して区切ります。
  • JSON キーは、署名のない文字または数字、_ であり、スペースは使用できません。最初の文字を数字に設定しないでください。

XMLとは何ですか?

XML は eXtensible Markup Language の略で、World Wide Web Consortium によって提案された拡張可能マークアップ言語とも呼ばれます (https://www.w3.org/) 他のマークアップ言語を作成します。 これは、さまざまな種類のデータを記述できる単純なサブセットであるため、システム間でデータを共有する場合に非常に役立ちます。

XML のタグは事前定義されていないことがよくありますが、ユーザーの規則に従って作成されます。 XML HTML の利点に基づいた新機能が導入されています。

さまざまなシステムやソリューションには、さらに便利な XML 作成機能がいくつかあります。

  • XML は拡張可能です: XML を使用すると、アプリケーションに合わせて独自のカスタム タグを作成できます。
  • XML はデータを表示するのではなく、データを伝達します。XML を使用すると、表示方法に関係なくデータを保存できます。
  • XML は共通標準です。XML は World Wide Web Consortium (W3C) によって開発され、オープン標準として利用できます。

XML はネストされたノード構造に基づいて構築されます。 各ノードには、次のように開始タグと終了タグがあります。

<node>content</node>

その中で:

  • はオープンタグです。このタグの名前はユーザーが定義します。
  • が閉じたタグである場合、このタグの名前は開いたタグの名前と一致する必要があります。
  • コンテンツ このタグの内容です。

各 XML ファイルの先頭で、使用している XML のバージョンを示すタグを宣言する必要があります。 命令タグの構文は次のとおりです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

グソンとは何ですか?

グソン (https://github.com/google/gson) は、ユーザーが Java オブジェクトから JSON 文字列に変換したり、JSON 文字列から Java オブジェクトに変換したりできるようにする Java ライブラリです。 Gson は、ソースコードがなくても、既存のオブジェクトを含む任意の Java オブジェクトを操作できます。

バージョン 1.6 以降、Gson には XNUMX つの新しいクラスが導入されました。 Jsonリーダー > Jsonライター JSON データのストリーミング処理を提供します。

  • Jsonライター – JSON へのストリーミング書き込み。 一般的な実装の構文は次のとおりです。 私たちは Jsonライター 物体。 JSON 文字列の作成を開始および終了するには、関数を使用します。 beginObject() > endObject(). この XNUMX つの関数の実行途中で、キー => 値のペアでデータの書き込みを実行します。
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
  • Jsonリーダー – JSON からのストリーミング読み取り。 一般的な実装の構文は次のとおりです。JsonReader オブジェクトを作成します。 JSON 文字列の作成を開始および終了するには、関数 beginObject() と endObject() を使用します。 これら XNUMX つの関数の実行途中で、キー => 値のペアでデータの読み取りを実行します。
JsonReader reader = new JsonReader();
reader.beginObject();
while (reader.hasNext()) {
	String name = reader.nextName();
	if (name.equals("key")) {
		String value = reader.nextString();
	}
}
reader.endObject();

Gson ストリーミング処理は高速です。 ただし、JSON データを処理する各ペア (キー => 値) を処理する必要があります。

JAXBとは何ですか?

JAXBはJavaの略です ArchiXML バインディングの構造。これは、アノテーションを使用して Java オブジェクトを XML コンテンツに変換する、またはその逆の変換を行うライブラリです。 JAXB は仕様によって定義されているため、この標準に対してさまざまな実装を使用できます。

JAXB では、よく次のように使用します。wing 基本的なアノテーション、つまり:

  • @XmlRootElement: このアノテーションは、XML ファイルの最も外側のタグが何であるかを指定するため、クラスの先頭で宣言されます。
  • @XmlElementWrapper: このアノテーションは、コレクションの周囲にラッパー XML 要素を作成します。
  • @XmlElement: オブジェクトの属性を宣言するために使用されるこのアノテーションは、XML ファイルのタグです。
  • @XmlAttribute: このアノテーションは、XML ファイルのタグであるオブジェクトの属性を宣言するためにも使用されます。

一般的な実装の構文は次のとおりです。 まず、初期化します JAXBコンテキスト を持つオブジェクト Myobject 変換するオブジェクト。

JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);

この中の JAXBコンテキスト オブジェクトには、XML コンテンツを Java オブジェクトに変換するオブジェクトを作成するメソッドがあります。 アンマーシャラー.

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

この中の JAXBコンテキスト オブジェクトには、Java オブジェクトを XML コンテンツに変換するオブジェクトを作成するメソッドがあります。 マーシャラー.

Marshaller marshallerObj = jaxbContext.createMarshaller();

XML を JSON に変換するにはどうすればよいですか?

XML - JSON 変換の例をプラットフォームに実装します。

  • Ubuntu 8 x18.04 用の JDK 64 を開きます。
  • Eclipse Ubuntu 用の IDE 2019-03 (4.11.0) x64 Java 開発。
  • Gson 2.8.5。

ステップ1) プロジェクトを作成します。
新しい Java プロジェクトを作成します。

新しい Java プロジェクトを作成します。
新しい Java プロジェクトを作成します。

ステップ2) プロジェクト名を設定します。
プロジェクト名を設定します XmlToJsonの例.

プロジェクト名を設定する

プロジェクト名を設定します。

ステップ3) フォルダを作成します。
フォルダを作成する データ入力 XNUMXつのファイルを含む サンプル.xml > サンプル.json.

フォルダーデータの作成

フォルダーデータの作成・入力。

まず XML を定義しましょう 部門, 役割 > プロパティ。

一般的な archi技術は: ; 。

オブジェクトの関係

オブジェクトの関係。

<?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"
				}
			]
		}
	]	
}

ステップ4) オブジェクトを定義します。
パッケージ内で対応するオブジェクト クラスを定義する .

オブジェクトクラスを定義する

オブジェクトクラスを定義します。

  • 役割.java:
@XmlRootElement(name = "role")
public class Role {
	private String id;
	private String position;
	private String salary;
	public Role() {
		super();
	}
	public Role(String id, String position, String salary) {
		super();
		this.id = id;
		this.position = position;
		this.salary = salary;
	}
	@XmlAttribute(name = "id")
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@XmlElement(name = "position")
	public String getPosition() {
		return position;
	}
	public void setPosition(String position) {
		this.position = position;
	}
	@XmlElement(name = "salary")
	public String getSalary() {
		return salary;
	}
	public void setSalary(String salary) {
		this.salary = salary;
	}
}
  • 人物.java:
@XmlRootElement(name = "person")
public class Person {
	private String id;
	private String name;
	private String role;
	public Person() {
		super();
	}
	public Person(String id, String name, String role) {
		super();
		this.id = id;
		this.name = name;
		this.role = role;
	}
	@XmlAttribute(name = "id")
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@XmlElement(name = "name")
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	@XmlElement(name = "role")
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
}
  • 部門.java:
@XmlRootElement(name = "department")
public class Department {
	private List<Role> roles;
	private List<Person> persons;
	public Department() {
		super();
	}
	public Department(List<Role> roles, List<Person> persons) {
		super();
		this.roles = roles;
		this.persons = persons;
	}
	@XmlElementWrapper(name = "roles")
	@XmlElement(name = "role")
	public List<Role> getRoles() {
		return roles;
	}
	public void setRoles(List<Role> roles) {
		this.roles = roles;
	}
	@XmlElementWrapper(name = "persons")
	@XmlElement(name = "person")
	public List<Person> getPersons() {
		return persons;
	}
	public void setPersons(List<Person> persons) {
		this.persons = persons;
	}
}

XMLModel.java:

@XmlRootElement(name = "root")
public class XMLModel {

	private Department department;

	public XMLModel() {
		super();
	}

	public XMLModel(Department department) {
		super();
		this.department = department;
	}

	@XmlElement(name = "department")
	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

}

ステップ5) ライブラリをセットアップします。
ライブラリ Gson 2.8.5 を Java ビルド パスに追加してセットアップします。

ライブラリ Gson をセットアップする

ライブラリ Gson 2.8.5 を Java ビルド パスに追加します

ライブラリ Gson 2.8.5 を Java ビルド パスに追加します。

JAXB を使用して XML メッセージを Java オブジェクトに変換する

まず、パッケージ内のクラス分けの実行を定義します。 サービス.

実行クラスを定義する

実行クラスを定義します。

最初のプロセスの最初のステップでは、JAXB の手法 Un-marshalling を使用します。

アンマーシャリングにより、クライアント アプリケーションは XML データを JAXB 派生の Java オブジェクトに変換できるようになります。

関数を定義します getObjectFromXmlFile XML ファイルをアンマーシャリングして Java オブジェクトに戻します。 この関数はクラスで定義されています XMLサービス.

public XMLModel getObjectFromXmlFile(String filePath) {
	try {
		File file = new File(filePath);
		JAXBContext jaxbContext = JAXBContext.newInstance(XMLModel.class);

		Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
		XMLModel root = (XMLModel) jaxbUnmarshaller.unmarshal(file);

		return root;
	} catch (JAXBException e) {
		e.printStackTrace();
		return null;
	}
}

上記のコードをクラスで呼び出します XmlToJsonService.

XMLService xmlService = new XMLService();
XMLModel xmlModel = xmlService.getObjectFromXmlFile(filePathIn);

Department department = xmlModel.getDepartment();
List<Role> roles = department.getRoles();
List<Person> persons = department.getPersons();

次に、次のステップに進みます。

Gson を使用して Java オブジェクトを JSON メッセージに変換する

このステップでは、関数を定義します writeDataToJsonFile データを JSON ファイルに書き込みます。 この関数はクラスで定義されています JsonService.

JSON 文字列のリストを書き込むには、関数を使用することに注意してください。 beginArray() > endArray()。 これら XNUMX つの関数の間に、それぞれの JSON 文字列を記述します。

public void writeDataToJsonFile(String filePath, List<Role> roles, List<Person> persons) {
	try {
		JsonWriter writer = new JsonWriter(new FileWriter(filePath));
		writer.setIndent("    ");
		writer.beginObject();
		writer.name("roles");
		writer.beginArray();
		for (Role role : roles) {
			writer.beginObject();
			writer.name("id").value(role.getId());
			writer.name("position").value(role.getPosition());
			writer.name("salary").value(role.getSalary());
			writer.name("persons");
			writer.beginArray();
			for (Person person : persons) {
				if (person.getRole().equalsIgnoreCase(role.getId())) {
					writer.beginObject();
					writer.name("id").value(person.getId());
					writer.name("name").value(person.getName());
					writer.endObject();
				}
			}
			writer.endArray();
			writer.endObject();
		}
		writer.endArray();
		writer.endObject();
		writer.close();
	} catch (IOException e) {
	}
}

上記のコードをクラス内で呼び出します XmlToJsonService.

JsonService jsonService = new JsonService();
jsonService.writeDataToJsonFile(filePathOut, roles, persons);

それが最初のプロセスです。

Gson を使用して JSON メッセージを Java オブジェクトに変換する

XNUMX番目のプロセスの最初のステップで、関数を定義します getDataFromJsonFile JSON ファイルからデータを読み取ります。 この関数はクラスで定義されています JsonService.

JSON 文字列のリストを読み取るには、関数を使用することに注意してください。 beginArray() > endArray()。 これら XNUMX つの関数の間で、各 JSON 文字列を読み取ります。

public void getDataFromJsonFile(String filePath, List<Role> roles, List<Person> persons) {
	try {
		JsonReader reader = new JsonReader(new FileReader(filePath));
		reader.beginObject();
		while (reader.hasNext()) {
			String nameRoot = reader.nextName();
			if (nameRoot.equals("roles")) {
				reader.beginArray();
				while (reader.hasNext()) {
					reader.beginObject();
					Role role = new Role();
					while (reader.hasNext()) {
						String nameRole = reader.nextName();
						if (nameRole.equals("id")) {
							role.setId(reader.nextString());
						} else if (nameRole.equals("position")) 
					        { role.setPosition(reader.nextString());
						} else if (nameRole.equals("salary")) {
						  role.setSalary(reader.nextString());
						} else if (nameRole.equals("persons")) {
							reader.beginArray();
							while (reader.hasNext()) {
								reader.beginObject();

Person person = new Person();

						person.setRole(role.getId());

						while (reader.hasNext()) {
						String namePerson = reader.nextName();

							if (namePerson.equals("id")) {
						person.setId(reader.nextString());
						} else if (namePerson.equals("name")) {
						person.setName(reader.nextString());
							}
						}
								persons.add(person);
								reader.endObject();
							}
							reader.endArray();
						}
					}
					roles.add(role);
					reader.endObject();
				}
				reader.endArray();
			}
		}
		reader.endObject();
		reader.close();
	} catch (IOException e) {

	}
}

上記のコードをクラス内で呼び出します XmlToJsonService.

JsonService jsonService = new JsonService();
List<Role> roles = new ArrayList<>();
List<Person> persons = new ArrayList<>();

jsonService.getDataFromJsonFile(filePathIn, roles, persons);

Json を XML Java に変換するにはどうすればよいですか?

JSON から XML in JAVA JSONObject json = new JSONObject(str); を使用して変換されます。 弦 xml = XML。 有効な dtd ファイルまたは xml ファイルがある場合、json を xml に、また xml を json に変換するのは非常に簡単です。

次に、次のステップに進みます。

JAXB を使用して Java オブジェクトを XML メッセージに変換する

このステップでは、JAXB の手法 Marshalling を使用します。

マーシャリングにより、クライアント アプリケーションは JAXB 派生 Java オブジェクト ツリーを XML データに変換できるようになります。

Java オブジェクトを XML メッセージにマーシャリングする関数 parseObjectToXm を定義します。 この関数はクラスで定義されています

XMLService.
public void parseObjectToXml(String filePath, XMLModel xmlModel) {
	try {
		JAXBContext contextObj = JAXBContext.newInstance(XMLModel.class);

		Marshaller marshallerObj = contextObj.createMarshaller();
		marshallerObj.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

		marshallerObj.marshal(xmlModel, new FileOutputStream(filePath));
	} catch (JAXBException je) {
		System.out.println("JAXBException");
	} catch (IOException ie) {
		System.out.println("IOException");
	}
}

上記のコードをクラス内で呼び出します XmlToJsonService.

XMLService xmlService = new XMLService();
XMLModel xmlModel = new XMLModel();

Department department = new Department();
department.setRoles(roles);
department.setPersons(persons);

xmlModel.setDepartment(department);

xmlService.parseObjectToXml(filePathOut, xmlModel);

それがXNUMX番目のプロセスです。

まとめ

このチュートリアルでは、JAXB が XML データを読み取り、Gson がそれを JSON に書き込む方法の XNUMX つを簡単に学びました。 それどころか、Gson の読み方もわかりました。 JSONの データと JAXB はそれを XML に書き込みます。