Что такое JSON?
JSON — это аббревиатура для Javascript Object Notation, которая представляет собой форму данных, которая следует определенному правилу, согласно которому большинство языков программирования в настоящее время доступны для чтения. Мы можем легко сохранить его в файл или запись в базе данных. Формат JSON использует пары ключ-значение для описания данных.
В следующем примере мы определяем строку JSON, в которой хранится личная информация:
{
"username" : "guru99user",
"email" : "[email protected]"
}
Так что синтаксис JSON очень прост. Каждая информация о данных будет состоять из двух частей: ключа и значения, которые соответствуют имени поля и его значению в определенной записи. Но, если посмотреть дальше, есть несколько таких вещей:
- Строка JSON заключена в фигурные скобки {}.
- Ключи и значения JSON должны быть заключены в кавычки {"}.
- Если данных больше (больше пар ключ => значение), мы используем запятые (,) для разделения.
- Ключи JSON должны быть беззнаковыми буквами или цифрами _, без пробелов, первый символ не должен быть установлен на цифры.
В этом уроке вы узнаете
- Что такое JSON?
- Что такое XML?
- Что такое Гсон?
- Что такое JAXB?
- Начальная настройка
- Преобразование сообщения XML в объекты Java с использованием JAXB
- Преобразование объектов Java в сообщение JSON с помощью Gson
- Преобразование сообщения JSON в объекты Java с помощью Gson
- Преобразование объектов Java в сообщение XML с использованием JAXB
Что такое XML?
XML означает расширяемый язык разметки, также называемый расширяемым языком разметки, предложенный Консорциумом World Wide Web ( http://www.w3.org/ ) для создания других языков разметки. Это простое подмножество, которое может описывать множество различных типов данных, поэтому оно очень полезно для обмена данными между системами.
Теги в XML часто не предопределены, но они создаются в соответствии с пользовательскими соглашениями. XML вводит новые функции, основанные на преимуществах HTML.
В различных системах и решениях есть еще несколько полезных функций создания XML:
- XML расширяем: XML позволяет создавать собственные теги в соответствии с вашим приложением.
- XML переносит данные, а не отображает их: XML позволяет хранить данные независимо от того, как они будут отображаться.
- XML является общим стандартом: XML был разработан Консорциумом World Wide Web (W3C) и доступен в качестве открытого стандарта.
XML построен на структуре вложенных узлов. Каждый узел будет иметь открывающий тег и закрывающий тег следующим образом:
<node>content</node>
В котором:
- <узел> - это открытый тег, имя этого тега определяется вами.
- </ node> - закрытый тег, имя этого тега должно совпадать с именем открытого тега.
- content - это содержимое этого тега.
В верхней части каждого XML-файла вы должны объявить тег, указывающий, какая версия XML используется. Синтаксис тега инструкции:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Что такое Гсон?
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 () . В середине выполнения этих двух функций мы выполняем запись данных парами (ключ => значение).
JsonWriter writer = new JsonWriter(); writer.beginObject(); writer.name("key").value("value"); writer.endObject();
- JsonReader - потоковое чтение из JSON. Синтаксис для общей реализации следующий. Мы создаем объект JsonReader. Чтобы начать и закончить создание строки JSON, мы используем функции beginObject () и 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 Streaming обрабатывает быстро. Однако вам нужно обрабатывать каждую пару (ключ => значение) обработки данных 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 в контент XML, который является Marshaller .
Marshaller marshallerObj = jaxbContext.createMarshaller();
Начальная настройка
Мы реализуем пример преобразования XML - JSON на платформу:
- Откройте JDK 8 для Ubuntu 18.04 x64.
- Eclipse IDE 2019-03 (4.11.0) x64 Разработка Java для Ubuntu.
- Гсон 2.8.5.
Шаг 1 . Создайте новый проект Java.
Шаг 2 . Задайте имя проекта XmlToJsonExample .
Шаг 3 . Создайте папку data / input, содержащую два файла sample.xml и sample.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 . Определите соответствующие классы объектов в модели пакета .
- Role.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.
Преобразование сообщения XML в объекты Java с использованием JAXB
Во - первых, мы определяем , выполняющих классифицироваться в пакет обслуживания .
На первом этапе первого процесса мы используем технику Un-marshalling из JAXB.
Un-marshalling предоставляет клиентскому приложению возможность преобразовывать данные XML в объекты Java, полученные из JAXB.
Мы определяем функцию 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();
Тогда мы идем к следующему шагу.
Преобразование объектов Java в сообщение JSON с помощью Gson
На этом этапе мы определяем функцию 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);
Это первый процесс.
Преобразование сообщения JSON в объекты Java с помощью Gson
На первом этапе второго процесса мы определяем функцию 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);
Тогда мы идем к следующему шагу.
Преобразование объектов Java в сообщение XML с использованием JAXB
На этом этапе мы используем технику Marshalling из 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.
Эта статья предоставлена Дэвидом Говардом