JAVA

[JAVA] Gson의 고급 기능

인생아 2024. 12. 14. 09:42
반응형

Gson은 기본적인 JSON 직렬화 및 역직렬화 기능 외에도 사용자 정의 직렬화 및 역직렬화, TypeAdapter, JsonSerializer/JsonDeserializer 활용, 그리고 JSON 데이터 포맷팅과 Pretty Printing과 같은 고급 기능을 제공합니다. 이러한 기능은 JSON 형식이 복잡하거나 맞춤형 처리가 필요한 경우 유용하게 사용할 수 있습니다.

사용자 정의 직렬화 및 역직렬화

Gson은 데이터 직렬화/역직렬화 과정을 사용자 정의할 수 있습니다. 이를 통해 데이터 구조가 특수하거나 JSON 형식을 맞춤형으로 변환해야 할 때 활용할 수 있습니다.

사용자 정의 직렬화

다음은 Person 클래스의 age를 특정 조건에 따라 다른 값으로 변환하는 사용자 정의 직렬화 예제입니다.

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import java.lang.reflect.Type;

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(Person.class, new PersonSerializer())
            .create();

        Person person = new Person("김철수", 20, "서울");

        String json = gson.toJson(person);
        System.out.println("직렬화된 JSON: " + json);
    }
}

class Person {
    String name;
    int age;
    String city;

    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
}

class PersonSerializer implements JsonSerializer<Person> {
    @Override
    public JsonElement serialize(Person person, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("name", person.name);
        jsonObject.addProperty("city", person.city);
        // age가 20보다 작으면 "Underage", 크거나 같으면 나이 값
        jsonObject.addProperty("age", person.age < 20 ? "Underage" : person.age);
        return jsonObject;
    }
}

출력 결과:

직렬화된 JSON: {"name":"김철수","city":"서울","age":20}

사용자 정의 역직렬화

역직렬화 시 JSON 필드 이름이 클래스와 다르거나 특정 조건을 처리해야 하는 경우 사용자 정의 역직렬화를 사용할 수 있습니다.

import com.google.gson.*;
import java.lang.reflect.Type;

public class Main {
    public static void main(String[] args) {
        String json = "{\"fullName\":\"김철수\",\"age\":25,\"city\":\"부산\"}";

        Gson gson = new GsonBuilder()
            .registerTypeAdapter(Person.class, new PersonDeserializer())
            .create();

        Person person = gson.fromJson(json, Person.class);
        System.out.println("이름: " + person.name + ", 나이: " + person.age + ", 도시: " + person.city);
    }
}

class PersonDeserializer implements JsonDeserializer<Person> {
    @Override
    public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        String name = jsonObject.get("fullName").getAsString();
        int age = jsonObject.get("age").getAsInt();
        String city = jsonObject.get("city").getAsString();
        return new Person(name, age, city);
    }
}

출력 결과:

이름: 김철수, 나이: 25, 도시: 부산
반응형

TypeAdapter 활용

TypeAdapter는 Gson의 성능 최적화를 위해 제공되며, 사용자 정의 직렬화/역직렬화와 유사하지만 더 효율적인 구현이 가능합니다.

import com.google.gson.*;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        Gson gson = new GsonBuilder()
            .registerTypeAdapter(Person.class, new PersonTypeAdapter())
            .create();

        Person person = new Person("박영희", 30, "인천");

        // 직렬화
        String json = gson.toJson(person);
        System.out.println("TypeAdapter 직렬화된 JSON: " + json);

        // 역직렬화
        Person deserializedPerson = gson.fromJson(json, Person.class);
        System.out.println("역직렬화된 객체: " + deserializedPerson.name + ", " + deserializedPerson.age + ", " + deserializedPerson.city);
    }
}

class PersonTypeAdapter extends TypeAdapter<Person> {
    @Override
    public void write(JsonWriter out, Person person) throws IOException {
        out.beginObject();
        out.name("name").value(person.name);
        out.name("age").value(person.age);
        out.name("city").value(person.city);
        out.endObject();
    }

    @Override
    public Person read(JsonReader in) throws IOException {
        in.beginObject();
        String name = null, city = null;
        int age = 0;
        while (in.hasNext()) {
            switch (in.nextName()) {
                case "name": name = in.nextString(); break;
                case "age": age = in.nextInt(); break;
                case "city": city = in.nextString(); break;
            }
        }
        in.endObject();
        return new Person(name, age, city);
    }
}
 

JSON 데이터 포맷팅과 Pretty Printing

Pretty Printing은 JSON을 사람이 읽기 쉽도록 출력하는 기능입니다.

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        Person person = new Person("최지훈", 28, "대구");

        String prettyJson = gson.toJson(person);
        System.out.println("Pretty Printing JSON:");
        System.out.println(prettyJson);
    }
}

class Person {
    String name;
    int age;
    String city;

    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
}

출력 결과:

Pretty Printing JSON:
{
  "name": "최지훈",
  "age": 28,
  "city": "대구"
}
 

참고사이트

Gson 공식 문서: https://github.com/google/gson

반응형

'JAVA' 카테고리의 다른 글

[JAVA] Gson과 JSON 파싱  (0) 2024.12.14
[JAVA] Gson과 날짜/시간 처리  (0) 2024.12.14
[JAVA] Gson의 필드 컨트롤  (0) 2024.12.14
[JAVA] Gson과 복합 객체  (0) 2024.12.14
[JAVA] Gson과 Java 컬렉션  (0) 2024.12.13
[JAVA] Gson을 활용한 기본 JSON 처리  (0) 2024.11.25
[JAVA] Gson 환경 설정  (0) 2024.11.24
[JAVA] Gson 이란?  (1) 2024.11.23