使用 Gson 和 JAXB 将 JSON 转换为 XML Java
什么是 JSON?
JSON 是 Javascript Object Notation 的缩写,它是一种遵循大多数编程语言当前可读的特定规则的数据形式。我们可以轻松地将其保存到文件或数据库中的记录中。 JSON 格式使用键值对来描述数据。
在下面的示例中,我们定义了一个存储个人信息的 JSON 字符串:
{
"username" : "guru99user",
"email" : "[email protected] "
}
所以 JSON 的语法非常简单。每条数据信息都会有两部分:key和value,分别对应于某条记录中的字段名及其值。但进一步看,有几件事是这样的:
JSON 字符串用大括号 {} 括起来。
JSON 的键和值必须用引号 {“} 括起来。
如果有更多数据(更多key => value对),我们用逗号(,)分隔。
JSON 键应该是无符号的字母或数字,_,并且没有空格,第一个字符不应设置为数字。
在本教程中,您将学习-
什么是 JSON?
什么是 XML?
什么是 Gson?
什么是 JAXB?
如何将 XML 转换为 JSON?
使用 JAXB 将 XML 消息转换为 Java 对象
使用 Gson 将 Java 对象转换为 JSON 消息
使用 Gson 将 JSON 消息转换为 Java 对象
使用 JAXB 将 Java 对象转换为 XML 消息
什么是 XML?
XML 代表 eXtensible Markup Language 也称为万维网联盟 (https://www.w3.org/) 提出的用于创建其他标记语言的可扩展标记语言。这是一个简单的子集,可以描述许多不同类型的数据,因此在系统之间共享数据时非常有用。
XML 中的标签通常不是预定义的,而是根据用户约定创建的。 XML 在 HTML 的优点的基础上引入了新的特性。
在不同的系统和解决方案中还有一些更有用的 XML 制作功能:
XML 是可扩展的:XML 允许您创建自己的自定义标签以适合您的应用程序。
XML 携带数据,但不显示数据:XML 允许您存储数据,无论数据如何显示。
XML 是一种通用标准:XML 由万维网联盟 (W3C) 开发,可作为开放标准使用。
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 引入了两个新类 - JsonReader 和 JsonWriter 提供对 JSON 数据的流式处理。
JsonWriter – 流式写入 JSON。一般实现的语法如下。我们创建一个 JsonWriter 目的。要开始和完成创建 JSON 字符串,我们使用函数 beginObject() 和 endObject() 。 在执行这两个函数的过程中,我们执行了对(key => value)的数据写入。
JsonWriter writer = new JsonWriter();
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
JsonReader – 从 JSON 流式读取。一般实现的语法如下。我们创建一个 JsonReader 对象。要开始和结束创建 JSON 字符串,我们使用函数 beginObject() 和 endObject()。在执行这两个函数的过程中,我们使用pairs (key => value)来读取数据。
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 中,我们经常使用以下基本注解,即:
@XmlRootElement :这个注解指定了 XML 文件的最外层标签是什么,因此它被声明在一个类之上。
@XmlElementWrapper :此注解创建一个围绕集合的包装 XML 元素。
@XmlElement :这个用来声明对象属性的注解是XML文件的一个标签。
@XmlAttribute :这个注解也用来声明对象的一个属性是XML文件的一个标签。
一般实现的语法如下。首先,我们将初始化 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转换的例子:
为 Ubuntu 18.04 x64 打开 JDK 8。
Eclipse IDE 2019-03 (4.11.0) x64 Java Development for Ubuntu。
Gson 2.8.5。
第 1 步 .创建项目。 创建一个新的 Java 项目。
图>
第 2 步 .设置项目名称。 设置项目名称为 XmlToJsonExample .
图>
第 3 步 .创建文件夹。 创建文件夹data/input 包含两个文件 sample.xml 和 sample.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 中定义对应的对象类 .
图>
@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;
}
}
@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;
}
}
@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 到 XML 在 JAVA 中 通过使用 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 的方式。