Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 Gson을 활용해 기존 JSON 파일에 새로운 JSON 데이터 추가하기

Gson은 Java에서 널리 사용되는 JSON 라이브러리로, JSON 데이터를 생성하고 파싱하는 작업을 손쉽게 처리할 수 있습니다. 기존 JSON 파일에 새로운 JSON 문자열을 추가하려면 몇 가지 단계를 거쳐야 합니다.

처리 과정 개요

먼저 기존 JSON 파일을 읽어 Java 객체로 파싱합니다. 그다음 해당 객체를 JsonObject로 타입 캐스팅하고, 필요한 필드를 JsonArray로 변환합니다. 이후 JSON 배열을 반복(iteration)하면서 각 JsonElement를 출력할 수 있습니다.

새로운 데이터를 파일에 쓰기 위해서는 JsonWriter 클래스를 활용합니다. JsonWriter는 스트림(stream)에 JSON 인코딩된 값을 토큰 단위로 하나씩 기록하는 역할을 합니다. 마지막으로, 새로 생성한 JSON 문자열을 기존 JSON 파일에 작성하면 됩니다.

예제 코드

아래 예제는 employee1.json 파일을 읽고, 기존 직원 목록에 새 직원 정보를 추가한 뒤 다시 파일에 저장하는 전체 과정을 보여줍니다.

import java.io.*;
import java.util.*;
import com.google.gson.*;
import com.google.gson.stream.*;
import com.google.gson.annotations.*;

public class JSONFilewriteTest {
    public static String nameRead;

    public static void main(String[] args) {
        try {
            // 1. 기존 JSON 파일 읽기 및 파싱
            JsonParser parser = new JsonParser();
            Object obj = parser.parse(new FileReader("employee1.json"));
            JsonObject jsonObject = (JsonObject) obj;

            System.out.println("employee1.json 파일의 내용:\n" + jsonObject);

            // 2. "emps" 배열 추출 후 요소 출력
            JsonArray msg = (JsonArray) jsonObject.get("emps");
            Iterator<JsonElement> iterator = msg.iterator();
            while (iterator.hasNext()) {
                nameRead = iterator.next().toString();
                System.out.println(nameRead);
            }

            // 3. 추가할 새로운 Name 객체 생성 및 JSON 문자열 변환
            Name name = new Name();
            name.setName("Vamsi");
            Gson gson = new Gson();
            String json = gson.toJson(name);

            // 4. JsonWriter를 사용해 기존 파일에 덮어쓰기
            FileWriter file = new FileWriter("employee1.json", false);
            JsonWriter jw = new JsonWriter(file);

            // 5. 기존 직원들을 Employees 객체에 담기
            iterator = msg.iterator();
            Employees emps = new Employees();
            while (iterator.hasNext()) {
                emps.addEmployee(gson.fromJson(iterator.next().toString(), Name.class));
            }

            // 6. 새 직원 추가 후 파일에 저장
            emps.addEmployee(name);
            gson.toJson(emps, Employees.class, jw);
            file.close();

            System.out.println("기존 employee1.json 파일에 데이터가 성공적으로 추가되었습니다.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// Name 클래스
class Name {
    @Expose
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

// Employees 클래스
class Employees {
    @Expose
    List<Name> emps = new ArrayList<>();

    public List<Name> getEmployees() {
        return emps;
    }

    public void addEmployee(Name name) {
        this.emps.add(name);
    }
}

실행 결과

employee1.json 파일의 내용:
{"emps":[{"name":"Adithya"},{"name":"Jai"}]}
{"name":"Adithya"}
{"name":"Jai"}
기존 employee1.json 파일에 데이터가 성공적으로 추가되었습니다.

실행 후 employee1.json 파일

프로그램 실행이 완료되면 employee1.json 파일에는 기존의 두 직원(Adithya, Jai)과 함께 새로 추가된 직원(Vamsi)까지 포함된 아래와 같은 구조로 저장됩니다.

{"emps":[{"name":"Adithya"},{"name":"Jai"},{"name":"Vamsi"}]}

핵심 포인트 정리

  • JsonParser: 파일이나 문자열 형태의 JSON을 Java 객체로 파싱합니다.
  • JsonObject / JsonArray: 파싱된 데이터를 타입 캐스팅하여 구조화된 형태로 다룹니다.
  • JsonWriter: 스트림에 JSON 값을 토큰 단위로 효율적으로 기록합니다.
  • @Expose 어노테이션: Gson의 직렬화 대상 필드를 명시적으로 지정할 때 사용합니다.
  • FileWriter의 append 모드: 위 예제에서는 false로 설정하여 전체 내용을 다시 쓰는 방식을 사용했습니다. JSON은 구조상 단순 append보다 전체를 읽어 수정 후 재저장하는 방식이 안전합니다.