산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바에서 Gson과 JAXB로 JSON을 XML로 변환하기: 단계별 가이드

JSON이란?

JSON(JavaScript Object Notation)은 키-값 쌍을 사용하는 가볍고 언어에 독립적인 데이터 형식입니다. 데이터 교환에 널리 사용되며 파일이나 데이터베이스에 쉽게 저장할 수 있습니다.

{ "username": "guru99user", "email": "guru99user@mail.com" }

주요 특징:

XML이란?

XML(eXtensible Markup Language)은 W3C 표준 구조화 데이터 형식입니다. HTML과 달리 순수 데이터 형식이며 시각적 렌더링이 없습니다. 사용자 정의 태그를 허용해 시스템 간 데이터 교환에 이상적입니다.

일반적인 노드 구조:

<node>content</node>

XML 파일 최상단에는 버전 선언이 필요합니다:

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

Gson이란?

Gson은 자바 객체를 JSON으로 직렬화하고 JSON을 자바 객체로 역직렬화하는 자바 라이브러리입니다. v1.6부터 JsonReader와 JsonWriter를 통한 스트리밍도 지원합니다.

스트리밍 작성자 예시:

JsonWriter writer = new JsonWriter(new FileWriter(filePath));
writer.beginObject();
writer.name("key").value("value");
writer.endObject();
writer.close();

JAXB란?

JAXB(Java Architecture for XML Binding)는 어노테이션을 사용해 자바 클래스를 XML에 매핑합니다. 마샬링(자바 → XML)과 언마샬링(XML → 자바)을 지원합니다.

주요 어노테이션:

프로젝트 설정

  1. IDE(예: Eclipse)에서 자바 프로젝트 생성
  2. 프로젝트명을 XmlToJsonExample으로 지정
  3. data/input 폴더 생성 후 sample.xml과 sample.json 배치
  4. Gson 2.8.5를 빌드 경로에 추가
  5. JAXB API 추가(자바 8에 보통 포함)

샘플 데이터

역할과 인원을 포함한 부서의 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"}]} ] }

자바 모델 클래스

model 패키지에 다음 POJO들을 정의하세요:

/* Role.java */
@XmlRootElement(name = "role")
public class Role {
    private String id, position, salary;
    // @XmlAttribute/@XmlElement 어노테이션이 붙은 getter, setter
}

/* Person.java */
@XmlRootElement(name = "person")
public class Person {
    private String id, name, role;
    // @XmlAttribute/@XmlElement 어노테이션이 붙은 getter, setter
}

/* Department.java */
@XmlRootElement(name = "department")
public class Department {
    private List<Role> roles;
    private List<Person> persons;
    // @XmlElementWrapper/@XmlElement가 붙은 getter/setter
}

/* XMLModel.java */
@XmlRootElement(name = "root")
public class XMLModel {
    private Department department;
    // @XmlElement가 붙은 getter/setter
}

XML을 자바 객체로 언마샬링 (JAXB)

public XMLModel getObjectFromXmlFile(String path) throws JAXBException {
    File file = new File(path);
    JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
    Unmarshaller um = ctx.createUnmarshaller();
    return (XMLModel) um.unmarshal(file);
}

자바 객체를 XML로 마샬링 (JAXB)

public void parseObjectToXml(String path, XMLModel model) throws JAXBException, IOException {
    JAXBContext ctx = JAXBContext.newInstance(XMLModel.class);
    Marshaller m = ctx.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(model, new FileOutputStream(path));
}

자바 객체를 JSON으로 직렬화 (Gson)

public void writeDataToJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
    JsonWriter writer = new JsonWriter(new FileWriter(path));
    writer.setIndent(" ");
    writer.beginObject();
    writer.name("roles").beginArray();
    for (Role r : roles) {
        writer.beginObject();
        writer.name("id").value(r.getId());
        writer.name("position").value(r.getPosition());
        writer.name("salary").value(r.getSalary());
        writer.name("persons").beginArray();
        for (Person p : persons)
            if (p.getRole().equals(r.getId())) {
                writer.beginObject();
                writer.name("id").value(p.getId());
                writer.name("name").value(p.getName());
                writer.endObject();
            }
        writer.endArray();
        writer.endObject();
    }
    writer.endArray();
    writer.endObject();
    writer.close();
}

JSON을 자바 객체로 역직렬화 (Gson)

public void getDataFromJsonFile(String path, List<Role> roles, List<Person> persons) throws IOException {
    JsonReader reader = new JsonReader(new FileReader(path));
    reader.beginObject();
    while (reader.hasNext()) {
        String rootName = reader.nextName();
        if ("roles".equals(rootName)) {
            reader.beginArray();
            while (reader.hasNext()) {
                reader.beginObject();
                Role r = new Role();
                while (reader.hasNext()) {
                    String key = reader.nextName();
                    switch (key) {
                        case "id": r.setId(reader.nextString()); break;
                        case "position": r.setPosition(reader.nextString()); break;
                        case "salary": r.setSalary(reader.nextString()); break;
                        case "persons":
                            reader.beginArray();
                            while (reader.hasNext()) {
                                reader.beginObject();
                                Person p = new Person();
                                p.setRole(r.getId());
                                while (reader.hasNext()) {
                                    String pKey = reader.nextName();
                                    if ("id".equals(pKey)) p.setId(reader.nextString());
                                    else if ("name".equals(pKey)) p.setName(reader.nextString());
                                }
                                persons.add(p);
                                reader.endObject();
                            }
                            reader.endArray();
                            break;
                    }
                }
                roles.add(r);
                reader.endObject();
            }
            reader.endArray();
        }
    }
    reader.endObject();
    reader.close();
}

전체 변환 워크플로

  1. JAXB를 사용해 sample.xml을 XMLModel로 언마샬링
  2. 결과 자바 객체를 Gson으로 sample.json에 직렬화
  3. sample.json을 다시 자바 객체로 역직렬화
  4. 해당 객체들을 새 XML 파일로 마샬링

결론

이 가이드는 깔끔한 2단계 변환 파이프라인을 보여줍니다: JAXB가 XML ↔ 자바를, Gson이 JSON ↔ 자바를 담당합니다. 두 라이브러리를 결합하면 자바 애플리케이션에서 포맷 간 데이터를 신뢰성 있게 변환할 수 있습니다.

java

  1. C++ 클래스와 객체: 캡슐화, 생성자/소멸자, 접근 제어 실전 가이드
  2. Java Hello World: 첫 Java 프로그램 작성 단계별 가이드
  3. Java String length() 메서드: 문자열 크기 구하기 (예제 포함)
  4. Java String.charAt() 완전 이해: 문법, 반환타입, 예외, 실전 예제
  5. Java String.contains() 메서드: 부분문자열 포함 여부 확인 (실전 예제)
  6. Java String.endsWith() 마스터: 문자열 접미사 확인 예제
  7. Java BufferedReader로 파일 읽기: 실전 가이드와 예제
  8. 자바에서 피보나치 수열 생성하기: for, while, 재귀 예제
  9. 자바 삽입 정렬 알고리즘: 명확한 예제와 단계별 가이드
  10. 자바 선택 정렬: 단계별 예제와 전체 코드