JAVA

[JAVA] Gson의 확장과 커스터마이징

인생아 2024. 12. 15. 13:50
반응형

Gson의 확장과 커스터마이징은 JSON 직렬화 및 역직렬화 과정을 제어하고 확장 가능하도록 도와줍니다. GsonBuilder를 사용하면 기본 설정을 변경하거나 사용자 정의 동작을 추가할 수 있으며, 플러그인과 다양한 라이브러리와의 연계를 통해 더욱 강력한 기능을 구현할 수 있습니다.

GsonBuilder를 사용한 커스터마이징
GsonBuilder는 Gson 객체를 구성할 때 다양한 설정을 추가할 수 있는 강력한 도구입니다. 이를 사용하면 기본 동작을 커스터마이징하거나 특수한 요구사항에 맞게 설정할 수 있습니다.

1. 포맷팅된 출력 설정
Gson의 기본 출력은 압축된 형태입니다. setPrettyPrinting을 사용하면 보기 쉬운 포맷으로 JSON을 생성할 수 있습니다.

import com.google.gson.*;

class Product {
    String name;
    int price;

    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }
}

public class Main {
    public static void main(String[] args) {
        Product product = new Product("스마트폰", 1200000);

        Gson gson = new GsonBuilder()
                .setPrettyPrinting()
                .create();

        String json = gson.toJson(product);
        System.out.println(json);
    }
}

출력 결과

{
  "name": "스마트폰",
  "price": 1200000
}

2. Null 값 포함 설정
기본적으로 Gson은 Null 값을 포함하지 않습니다. serializeNulls를 사용하여 Null 값을 포함할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        Product product = new Product("노트북", 0);

        Gson gson = new GsonBuilder()
                .serializeNulls()
                .create();

        String json = gson.toJson(product);
        System.out.println(json);
    }
}

출력 결과

{
  "name": "노트북",
  "price": 0
}

3. 날짜 형식 커스터마이징
날짜 필드는 기본적으로 Epoch 형식으로 처리됩니다. setDateFormat으로 날짜 형식을 지정할 수 있습니다.

import java.util.Date;

class Order {
    String productName;
    Date orderDate;

    public Order(String productName, Date orderDate) {
        this.productName = productName;
        this.orderDate = orderDate;
    }
}

public class Main {
    public static void main(String[] args) {
        Order order = new Order("의자", new Date());

        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();

        String json = gson.toJson(order);
        System.out.println(json);
    }
}
반응형

플러그인 및 확장 기능 소개
Gson은 TypeAdapter와 JsonSerializer/JsonDeserializer를 사용하여 데이터를 처리하는 방식을 확장할 수 있습니다.

1. Custom TypeAdapter
TypeAdapter는 특정 데이터 유형에 대한 직렬화와 역직렬화 방식을 정의합니다.

class PriceAdapter extends TypeAdapter<Integer> {
    @Override
    public void write(JsonWriter out, Integer value) throws IOException {
        out.value(value + "원");
    }

    @Override
    public Integer read(JsonReader in) throws IOException {
        String price = in.nextString();
        return Integer.parseInt(price.replace("원", ""));
    }
}

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

        Product product = new Product("책상", 50000);
        String json = gson.toJson(product);
        System.out.println(json);

        Product deserialized = gson.fromJson(json, Product.class);
        System.out.println("가격: " + deserialized.price);
    }
}

Gson과 기타 라이브러리와의 연계
Gson은 다른 라이브러리와 결합하여 기능을 확장할 수 있습니다. 대표적으로 Spring Boot, Retrofit과 같은 라이브러리와 연계해 유용한 결과를 얻을 수 있습니다.

1. Retrofit과의 연계
Retrofit은 REST API와의 상호작용을 단순화해주는 라이브러리입니다. Gson을 JSON 변환 라이브러리로 사용할 수 있습니다.

import retrofit2.*;
import retrofit2.converter.gson.GsonConverterFactory;
import java.util.List;

class User {
    String name;
    String city;
}

interface UserService {
    @GET("/users")
    Call<List<User>> getUsers();
}

public class Main {
    public static void main(String[] args) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.example.com")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UserService service = retrofit.create(UserService.class);

        try {
            Response<List<User>> response = service.getUsers().execute();
            response.body().forEach(user -> System.out.println(user.name + " - " + user.city));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

참고사이트

반응형