JSON을 XML로 변환 Java Gson과 JAXB를 사용하여
⚡ 스마트 요약
JSON을 XML로 변환 Java Gson과 JAXB를 사용하여 맵을 생성ping 두 형식을 동일한 주석이 달린 문서에 모두 표시합니다. Java 클래스. 이 문서에서는 각 형식을 정의하고, 프로젝트를 설정하고, JAXB를 사용하여 XML을 역직렬화하고, Gson을 사용하여 JSON을 작성하고, 전체 프로세스를 역으로 수행합니다.
JSON이란 무엇입니까?
JSON은 다음의 약어입니다. JavaJSON(Script Object Notation)은 대부분의 프로그래밍 언어가 읽을 수 있는 규칙을 따르는 데이터 형식입니다. 이를 통해 파일에 저장하거나 데이터베이스에 쉽게 저장할 수 있습니다. JSON 형식은 키-값 쌍을 사용하여 데이터를 설명합니다.
다음 예시에서는 개인 정보를 저장하는 JSON 문자열을 정의합니다.
{
"username" : "guru99user",
"email" : "guru99user@mail.com"
}
JSON의 구문은 매우 간단합니다. 각 데이터 항목은 키와 값, 두 부분으로 구성되며, 이는 레코드의 필드 이름과 해당 값에 해당합니다. 더 자세히 살펴보면 다음과 같은 몇 가지 규칙이 있습니다.
- JSON 문자열은 중괄호 {}로 묶입니다.
- JSON의 키는 큰따옴표로 묶어야 하며, 문자열 값도 마찬가지로 큰따옴표로 묶어야 합니다.
- 데이터가 많을 경우(키-값 쌍이 많을 경우) 쉼표(,)를 사용하여 구분합니다.
- JSON 키는 공백 없이 문자, 숫자 또는 밑줄(_) 문자만 사용해야 하며, 첫 번째 문자는 숫자가 아니어야 합니다.
XML이란 무엇입니까?
XML은 월드 와이드 웹 컨소시엄(W3C)에서 제안한 확장 가능한 마크업 언어(eXtensible Markup Language)의 약자입니다.https://www.w3.org/) 다른 마크업 언어를 만드는 데 사용됩니다. 이는 다양한 유형의 데이터를 설명할 수 있는 간단한 하위 집합이므로 시스템 간 데이터 공유에 매우 유용합니다.
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"?>
JSON과 XML의 주요 차이점
두 형식 모두 구조화된 데이터를 포함하며, 아래 표는 프로젝트에서 두 형식 간 전환이 필요한 이유를 보여줍니다.
| 매개 변수 | JSON | XML |
|---|---|---|
| 구문 스타일 | 키-값 쌍 | 중첩 태그 |
| 자료형 | 문자열, 숫자, 불리언, null, 배열, 객체 | 텍스트 전용이며, 유형은 스키마에서 가져옵니다. |
| Attributes | 지원되지 않음 | 모든 요소에서 지원됨 |
| 코멘트 | 지원되지 않음 | 지원 |
| 다변 | 콤팩트 | 태그가 반복되기 때문에 더 장황해집니다. |
| 스키마 검증 | JSON 스키마(선택 사항) | DTD 및 XSD, 성숙 단계 |
| 일반적인 사용 | 웹 API 및 구성 | 기업 메시징 및 문서 |
그슨이란 무엇입니까?
그손(https://github.com/google/gson)입니다 Java 사용자가 변환할 수 있도록 하는 라이브러리 Java 객체를 JSON 문자열로 변환하고, JSON 문자열을 다시 객체로 변환하는 기능 Java 물체. Gson은 임의의 작업을 수행할 수 있습니다. Java 소스 코드가 없는 기존 객체를 포함하여 모든 객체를 처리할 수 있습니다.
Gson은 버전 1.6부터 두 가지 클래스를 도입했습니다. JsonReader 존슨WriterJSON 데이터의 스트리밍 처리를 제공하기 위해서입니다.
- 존슨Writer – JSON 형식으로 스트리밍 쓰기. 우리는 다음을 생성합니다. 존슨Writer 객체. JSON 객체 생성을 시작하고 완료하기 위해 다음과 같은 함수를 사용합니다. 시작객체() 끝객체()이 두 호출 사이에 데이터를 키와 값의 쌍으로 기록합니다.
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 스트리밍 처리는 빠릅니다. 하지만 JSON 데이터의 각 키-값 쌍을 직접 처리해야 합니다.
JAXB란 무엇입니까?
JAXB는 다음을 의미합니다. Java Archi주석을 사용하여 변환하는 라이브러리인 XML 바인딩에 대한 강의 Java 객체를 XML 콘텐츠로, 또는 그 반대로 변환할 수 있습니다. JAXB는 명세에 의해 정의되므로 이 표준의 다양한 구현체를 사용할 수 있습니다.
JAXB를 사용할 때, 우리는 종종 다음과 같은 기본 어노테이션을 사용합니다.
- @XmlRootElement: 이 어노테이션은 XML 파일의 가장 바깥쪽 태그를 지정하므로 클래스 위에 선언됩니다.
- @XmlElementWrapper: 이 주석은 컬렉션 주위에 래퍼 XML 요소를 만듭니다.
- @XmlElement이 어노테이션은 객체의 속성이 XML 파일의 하위 태그가 됨을 선언합니다.
- @XmlAttribute이 어노테이션은 객체의 속성이 주변 태그의 속성이 됨을 선언합니다.
일반적인 구현 방법은 다음과 같습니다. 먼저 초기화를 진행합니다. JAXB컨텍스트 개체 내 개체 변환할 클래스입니다.
JAXBContext jaxbContext = JAXBContext.newInstance(MyObject.class);
이 JAXB컨텍스트 해당 객체는 XML 콘텐츠를 다른 형식으로 변환하는 객체를 생성하는 메서드를 가지고 있습니다. Java 객체, 언마샬러.
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
똑같다 JAXB컨텍스트 객체에는 객체를 변환하는 메서드를 가지고 있습니다. Java 객체를 XML 콘텐츠로 변환합니다. 마샬러.
Marshaller marshallerObj = jaxbContext.createMarshaller();
⚠️ 경고: JAXB는 JDK에서 제거되었습니다. Java 11. 에 Java 버전 11 이상에서는 API와 런타임 구현을 프로젝트에 명시적으로 추가하세요. 예를 들어... jakarta.xml.bind:jakarta.xml.bind-api 와 함께 org.glassfish.jaxb:jaxb-runtime그리고 주석을 가져옵니다. jakarta.xml.bind.annotation 대신 javax.xml.bind.annotation.
XML을 JSON으로 변환하는 방법은 무엇입니까?
아래 플랫폼에서 XML을 JSON으로 변환하는 예제를 구현했습니다. 아래 버전은 스크린샷에 사용된 버전입니다. 최신 JDK 릴리스에서는... Eclipse그리고 Gson도 위의 JAXB 참고 사항을 준수하는 한 동일한 방식으로 작동합니다.
- OpenJDK 8용 Ubuntu 18.04 x64.
- Eclipse IDE 2019-03(4.11.0) x64 Java 개발 Ubuntu.
- 그손2.8.5.
단계 1) 프로젝트를 만듭니다.
새 항목 만들기 Java 프로젝트.
단계 2) 프로젝트 이름을 설정하세요.
프로젝트 이름을 다음으로 설정합니다. XmlToJson예제.
단계 3) 폴더를 만듭니다.
폴더 생성 데이터 투입 두 개의 파일이 포함되어 있습니다. 샘플.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; } }
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; } }
부서.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 빌드 경로.
프로젝트에서 사용하는 경우 메이븐 수동으로 JAR 파일을 추가하는 대신, 동일한 라이브러리가 종속성으로 선언됩니다. 스크린샷과 일치하도록 2.8.5 버전을 고정했으며, 이후의 Gson 릴리스에서도 이 예제는 동일하게 작동합니다.
<dependencies> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- required on Java 11 and later --> <dependency> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </dependency> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> </dependency> </dependencies>
XML 메시지를 다음으로 변환 Java JAXB를 사용하는 객체
먼저 패키지 내에서 실행될 클래스들을 정의합니다. 서비스.
첫 번째 프로세스의 첫 번째 단계에서는 JAXB의 언마샬링 기법을 사용합니다.
언마샬링은 클라이언트 애플리케이션이 XML 데이터를 JAXB 파생 형식으로 변환할 수 있도록 해줍니다. Java 사물.
우리는 함수를 정의합니다 getObjectFromXml파일 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();
이 시점에서 XML 파일은 세 개가 되었습니다. Java 메모리에 객체를 저장합니다. 다음 단계에서는 이 객체들을 JSON 형식으로 출력합니다.
개 심자 Java Gson을 사용하여 객체를 JSON 메시지로 변환
이 단계에서 함수를 정의합니다. writeDataToJson파일 JSON 파일에 데이터를 기록합니다. 이 함수는 클래스에 정의되어 있습니다. JSON서비스.
JSON 객체 목록을 작성하려면 함수를 사용한다는 점에 유의하세요. 시작 배열() 끝 배열()이 두 호출 사이에 각 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);
이것이 첫 번째 과정입니다. 내부 루프는 각 사용자를 현재 역할 ID와 대조하는데, 이 과정을 통해 평면 XML 형식의 사용자 목록이 중첩된 JSON 배열로 변환됩니다.
JSON 메시지를 다음으로 변환 Java Gson을 사용하는 객체
두 번째 과정의 첫 번째 단계에서 함수를 정의합니다. getDataFromJson파일 JSON 파일에서 데이터를 읽는 함수입니다. 이 함수는 클래스에 정의되어 있습니다. JSON서비스.
JSON 객체 목록을 읽으려면 함수를 사용한다는 점에 유의하세요. 시작 배열() 끝 배열()이 두 호출 사이에 각 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 JAXB를 사용하여 객체를 XML 메시지로 변환
이 단계에서는 JAXB의 마샬링 기법을 사용합니다.
마샬링은 클라이언트 애플리케이션이 JAXB에서 파생된 객체를 변환할 수 있는 기능을 제공합니다. Java 개체 트리를 XML 데이터로 변환합니다.
우리는 함수를 정의합니다 parseObjectToXml 동원하다 Java 객체를 XML 메시지로 변환합니다. 이 함수는 클래스에 정의되어 있습니다. XML서비스.
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);
이것이 두 번째 과정입니다. 생성된 파일은 원본 sample.xml과 일치하며, 이는 왕복 과정에서 모든 값이 보존되었음을 확인시켜 줍니다.
JSON을 XML로 변환하는 방법 Java 모델 클래스 없이요?
위의 접근 방식은 구조가 알려져 있고 안정적일 때 올바른 선택입니다. 왜냐하면 주석이 달린 클래스가 구조를 문서화하기 때문입니다.trac구조를 알 수 없거나 자주 변경되는 경우 일반 변환기가 더 빠릅니다.
The org.json 이 라이브러리는 모델 클래스 없이 단 두 줄의 코드로 변환을 수행합니다.
import org.json.JSONObject; import org.json.XML; public class QuickConverter { public static void main(String[] args) { String str = "{\"username\":\"guru99user\",\"email\":\"guru99user@mail.com\"}"; JSONObject json = new JSONObject(str); String xml = XML.toString(json); System.out.println(xml); } }
출력:
<username>guru99user</username><email>guru99user@mail.com</email>
참고로 일반 경로는 루트 요소와 속성을 생성하지 않습니다. XML.toString(json, "root") 일반적으로 필요합니다. 아래 표는 두 가지 접근 방식을 나란히 비교합니다.
| 표준 | JAXB의 Gson | org.json 일반 변환 |
|---|---|---|
| 필수 모델 클래스 | 가능 | 아니 |
| 구조에 대한 제어 | 속성을 포함한 전체 내용 | 제한된 요소만 해당됩니다. |
| 레샤ping 데이터 | 중첩된 인물 구조에서 볼 수 있듯이 가능합니다. | 불가능 |
| 코드 줄 | 많은 | 두 |
| 가장 좋은 | 안정적이고 문서화된 스키마 | 임시적이거나 알려지지 않은 구조 |
JAXB는 XML 데이터를 읽고 Gson은 이를 JSON으로 기록하며, 역방향 경로에서는 Gson을 사용하여 데이터를 읽습니다. JSON JAXB는 데이터를 처리하는 동안 해당 데이터를 XML에 다시 기록합니다. 더 자세한 내용은 다음을 참조하십시오. XML 기본, 더 넓은 Java 지도 시간예산 및 재스퍼 리포트이는 두 가지 형식을 모두 보고서 데이터 소스로 사용합니다.









