亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> java

使用 Gson 和 JAXB 将 JSON 转换为 XML Java

什么是 JSON?

JSON 是 Javascript Object Notation 的缩写,它是一种遵循大多数编程语言当前可读的特定规则的数据形式。我们可以轻松地将其保存到文件或数据库中的记录中。 JSON 格式使用键值对来描述数据。

在下面的示例中,我们定义了一个存储个人信息的 JSON 字符串:

{
"username" : "guru99user",
"email" : "[email protected]"	
}

所以 JSON 的语法非常简单。每条数据信息都会有两部分:key和value,分别对应于某条记录中的字段名及其值。但进一步看,有几件事是这样的:

在本教程中,您将学习-

什么是 XML?

XML 代表 eXtensible Markup Language 也称为万维网联盟 (https://www.w3.org/) 提出的用于创建其他标记语言的可扩展标记语言。这是一个简单的子集,可以描述许多不同类型的数据,因此在系统之间共享数据时非常有用。

XML 中的标签通常不是预定义的,而是根据用户约定创建的。 XML 在 HTML 的优点的基础上引入了新的特性。

在不同的系统和解决方案中还有一些更有用的 XML 制作功能:

XML 建立在嵌套节点结构之上。每个节点都会有一个开始标签和一个结束标签,如下所示:

<node>content</node>

其中:

在每个 XML 文件的顶部,您必须声明一个标记以指示正在使用的 XML 版本。指令标签的语法:

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

什么是 Gson?

Gson (https://github.com/google/gson) 是一个 java 库,允许用户将 Java 对象转换为 JSON 字符串,也可以将 JSON 字符串转换为 Java 对象。 Gson 可以处理任意 Java 对象,包括现有对象,而无需您拥有它们的源代码。

从 1.6 版本开始,Gson 引入了两个新类 - JsonReaderJsonWriter 提供对 JSON 数据的流式处理。

JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
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 Architecture for XML Binding,它是一个使用注解将 Java 对象转换为 XML 内容的库,反之亦然。由于 JAXB 是通过规范定义的,因此我们可以为该标准使用不同的实现。

在 JAXB 中,我们经常使用以下基本注解,即:

一般实现的语法如下。首先,我们将初始化 JAXBContext MyObject 的对象 要转换的对象。

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

在这个 JAXBContext 对象,它有一个方法来创建一个将 XML 内容转换为 Java 对象的对象,Unmarshaller .

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

在这个 JAXBContext 对象,它有一个方法来创建将 Java 对象转换为 Marshaller 的 XML 内容的对象 .

Marshaller marshallerObj = jaxbContext.createMarshaller();

如何将 XML 转换为 JSON?

我们在平台上实现XML-JSON转换的例子:

第 1 步 .创建项目。
创建一个新的 Java 项目。

第 2 步 .设置项目名称。
设置项目名称为 XmlToJsonExample .

第 3 步 .创建文件夹。
创建文件夹data/input 包含两个文件 sample.xmlsample.json .

让我们首先用 department 定义我们的 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 步 .定义对象。
在包model中定义对应的对象类 .

  • 角色.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;
	}

}
  • Person.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;
	}

}
  • Department.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 构建路径中。

使用 JAXB 将 XML 消息转换为 Java 对象

首先,我们在包 service 中定义执行类 .

在第一个过程的第一步,我们使用了 JAXB 的 Un-marshalling 技术。

取消编组为客户端应用程序提供了将 XML 数据转换为 JAXB 派生的 Java 对象的能力。

我们定义函数 getObjectFromXmlFile 将我们的 XML 文件解组回 Java 对象。该函数在类 XMLService 中定义 .

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() .在这两个函数之间,我们编写了每个 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 对象

在第二个过程的第一步,我们定义函数 getDataFromJsonFile 从 JSON 文件中读取数据。该函数在类 JsonService 中定义 .

请注意,要读取 JSON 字符串列表,我们使用函数 beginArray()endArray() .在这两个函数之间,我们读取每个 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 到 XMLJAVA 中 通过使用 JSONObject json =new JSONObject(str); 进行转换;字符串 xml =XML .如果你有一个有效的 dtd 文件或 xml 文件,那么很容易将 json 转换为 xml,也可以将 xml 转换为 json。

然后我们进入下一步。

使用 JAXB 将 Java 对象转换为 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);

这是第二个过程。

结论

在本教程中,我们简要了解了 JAXB 读取 XML 数据并将 Gson 写入 JSON 的一种方式。相反,我们也看到了 Gson 读取 JSON 数据,JAXB 将其写入 XML 的方式。


java

  1. 带有示例的 C++ 类和对象
  2. Java Hello World:如何通过示例编写您的第一个 Java 程序
  3. Java OOP 中的封装与示例
  4. Java 变量和数据类型与示例
  5. Java 中的 String Length() 方法:如何通过示例查找
  6. Java String charAt() 方法及示例
  7. Java String contains() 方法 |用示例检查子字符串
  8. Java String endsWith() 方法及示例
  9. Java BufferedReader:如何通过示例在 Java 中读取文件
  10. Java中使用递归和循环程序的斐波那契数列
  11. Java中的插入排序算法及程序示例
  12. Java程序中的选择排序与示例