예제와 함께 Gson 및 JAXB를 사용하여 JSON을 XML Java로 변환
JSON이란 무엇입니까?
JSON은 Javascript Object Notation의 약자로 현재 대부분의 프로그래밍 언어가 읽을 수 있는 특정 규칙을 따르는 데이터 형식입니다. 파일로 쉽게 저장하거나 데이터베이스에 기록할 수 있습니다. JSON 형식은 키-값 쌍을 사용하여 데이터를 설명합니다.
다음 예에서는 개인 정보를 저장하는 JSON 문자열을 정의합니다.
{
"username" : "guru99user",
"email" : "[email protected] "
}
따라서 JSON 구문은 매우 간단합니다. 각 데이터 정보는 필드 이름과 특정 레코드의 값에 해당하는 키와 값의 두 부분으로 구성됩니다. 그러나 자세히 살펴보면 다음과 같은 몇 가지 사항이 있습니다.
JSON 문자열은 중괄호 {}로 묶여 있습니다.
JSON의 키와 값은 따옴표 {“}로 묶어야 합니다.
데이터가 더 많은 경우(더 많은 키 => 값 쌍) 쉼표(,)를 사용하여 구분합니다.
JSON 키는 부호 없는 문자 또는 숫자, _, 공백이 없어야 하며 첫 번째 문자는 숫자로 설정하면 안 됩니다.
이 튜토리얼에서는 배우게 될 것입니다-
JSON이란 무엇입니까?
XML이란 무엇입니까?
지손이란?
JAXB란 무엇입니까?
XML을 JSON으로 변환하는 방법
JAXB를 사용하여 XML 메시지를 Java 객체로 변환
Gson을 사용하여 Java 객체를 JSON 메시지로 변환
Gson을 사용하여 JSON 메시지를 Java 객체로 변환
JAXB를 사용하여 Java 객체를 XML 메시지로 변환
XML이란 무엇입니까?
XML은 다른 마크업 언어를 만들기 위해 World Wide Web Consortium(https://www.w3.org/)에서 제안한 확장 가능한 마크업 언어라고도 하는 eXtensible Markup Language의 약자입니다. 이것은 다양한 유형의 데이터를 설명할 수 있는 간단한 하위 집합이므로 시스템 간에 데이터를 공유하는 데 매우 유용합니다.
XML의 태그는 미리 정의되지 않은 경우가 많지만 사용자 규칙에 따라 생성됩니다. XML은 HTML의 장점을 기반으로 한 새로운 기능을 도입했습니다.
다양한 시스템 및 솔루션에는 다음과 같은 유용한 XML 작성 기능이 있습니다.
XML은 확장 가능합니다. XML을 사용하면 애플리케이션에 맞게 사용자 정의 태그를 생성할 수 있습니다.
XML은 데이터를 표시하는 것이 아니라 전달합니다. XML을 사용하면 데이터가 표시되는 방식에 관계없이 데이터를 저장할 수 있습니다.
XML은 공통 표준입니다. XML은 W3C(World Wide Web Consortium)에서 개발했으며 공개 표준으로 제공됩니다.
XML은 중첩 노드 구조를 기반으로 합니다. 각 노드에는 다음과 같이 여는 태그와 닫는 태그가 있습니다.
<node>content</node>
중:
<노드> 은(는) 열린 태그이고 이 태그의 이름은 사용자가 정의합니다.
닫힌 태그인 경우 이 태그의 이름은 열린 태그의 이름과 일치해야 합니다.
콘텐츠 이 태그의 내용입니다.
각 XML 파일의 맨 위에는 XML이 사용 중인 버전을 나타내는 태그를 선언해야 합니다. 명령어 태그의 구문:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> Gson이란 무엇입니까?
Gson(https://github.com/google/gson)은 사용자가 Java 개체에서 JSON 문자열로 변환하고 JSON 문자열에서 Java 개체로 변환할 수 있도록 하는 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() 함수를 사용합니다. 이 두 함수를 실행하는 도중에 쌍(key => 값)으로 데이터 읽기를 수행합니다.
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 데이터 처리의 각 쌍(key => 값)을 처리해야 합니다.
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) Ubuntu용 x64 Java 개발
지손 2.8.5.
1단계 . 프로젝트를 생성합니다. 새 자바 프로젝트를 생성합니다.
그림>
2단계 . 프로젝트 이름을 설정합니다. 설정 프로젝트 이름은 XmlToJsonExample 입니다. .
그림>
3단계 . 폴더를 생성합니다. 폴더 생성 데이터/입력 두 개의 파일 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단계 . 개체를 정의합니다. 패키지 모델 에서 해당 개체 클래스를 정의합니다. .
그림>
@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단계 . 라이브러리를 설정합니다. Java 빌드 경로에 라이브러리 Gson 2.8.5를 추가하고 설정합니다.
그림> 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의 마샬링 기법을 사용합니다.
마샬링은 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);
두 번째 과정입니다.
결론
이 튜토리얼에서 우리는 JAXB가 XML 데이터를 읽고 Gson이 그것을 JSON에 쓸 수 있는 한 가지 방법을 간략하게 배웠습니다. 반대로 Gson이 JSON 데이터를 읽고 JAXB가 XML에 쓰는 방식도 보았습니다.