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

JSONとは何ですか?

JSONは、 Javascript オブジェクト表記法は、現在ほとんどのプログラミング言語で読み取り可能な特定のルールに従うデータ形式です。ファイルやデータベースのレコードに簡単に保存できます。JSON 形式では、キーと値のペアを使用してデータを記述します。

次の例では、個人情報を保存する 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 オブジェクト。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バインディングのアーキテクチャは、アノテーションを使用してXML文書を変換するライブラリです。 Java オブジェクトを XML コンテンツに変換したり、その逆を行ったりできます。JAXB は仕様に基づいて定義されているため、この標準にはさまざまな実装を使用できます。

JAXB では、次のような基本的なアノテーションがよく使用されます。

  • @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 変換の例をプラットフォームに実装します。

  • JDK 8 を開く Ubuntu 18.04 x64。
  • Eclipse IDE 2019-03 (4.11.0) x64 Java のための開発 Ubuntu.
  • Gson 2.8.5。

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

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

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

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

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

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

フォルダーデータの作成

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

まず 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"
				}
			]
		}
	]	
}

ステップ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 ビルドパス。

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

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

実行クラスを定義する

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

最初のプロセスの最初のステップでは、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();

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

変換 Java Gson を使用してオブジェクトを 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);

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

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

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 に変換するのは非常に簡単です。

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

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

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

マーシャリングは、クライアントアプリケーションにJAXB派生のデータを変換する機能を提供します。 Java オブジェクト ツリーを XML データに変換します。

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

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 に書き込みます。