JAVA

[JAVA] Gson과 최신 Java 기능 연계

인생아 2024. 12. 15. 12:43
반응형

Gson과 최신 Java 기능 연계는 Gson 라이브러리와 Java 8 이상에서 도입된 최신 기능들을 함께 사용하는 방법을 다룹니다. Lambda 표현식, Stream API, Optional, 그리고 Java 16 Records를 활용하면 코드의 가독성과 효율성을 크게 향상시킬 수 있습니다. 각 기능을 Gson과 통합하는 방법과 예제를 통해 이를 구체적으로 살펴보겠습니다.

Lambda 표현식과 Stream API 활용
Lambda 표현식과 Stream API는 대량의 데이터를 처리하거나 변환할 때 매우 유용합니다. Gson과 결합하면 JSON 데이터를 유연하게 처리할 수 있습니다.

1. JSON 배열 데이터를 Java 리스트로 변환
Lambda와 Stream API를 사용하여 JSON 배열을 간단하게 Java 객체 리스트로 변환할 수 있습니다.

import com.google.gson.*;
import java.util.*;
import java.util.stream.Collectors;

class User {
    String name;
    int age;

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

    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + "}";
    }
}

public class Main {
    public static void main(String[] args) {
        String json = "[{\"name\":\"홍길동\",\"age\":30},{\"name\":\"김영희\",\"age\":25}]";

        Gson gson = new Gson();
        User[] users = gson.fromJson(json, User[].class);

        List<User> userList = Arrays.stream(users)
                .filter(user -> user.age > 20) // 나이 조건 필터
                .collect(Collectors.toList());

        userList.forEach(System.out::println);
    }
}

2. 리스트 데이터를 JSON으로 변환
Java 객체 리스트를 JSON 문자열로 변환하는 것도 Stream API와 결합하면 간결해집니다.

public class Main {
    public static void main(String[] args) {
        List<User> users = List.of(
                new User("이철수", 28),
                new User("박민수", 22)
        );

        Gson gson = new Gson();
        String json = users.stream()
                .map(gson::toJson)
                .collect(Collectors.joining(", ", "[", "]"));

        System.out.println(json); // [{"name":"이철수","age":28},{"name":"박민수","age":22}]
    }
}
반응형

Optional과의 통합
Java의 Optional은 Null 값을 처리하는 강력한 도구입니다. Gson과 함께 사용하면 JSON 데이터에서 값이 없거나 Null인 상황을 더욱 안전하게 처리할 수 있습니다.

1. Optional 필드 직렬화 및 역직렬화
Gson을 사용하여 Optional 필드를 처리하려면 TypeAdapter를 사용해야 합니다.

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

class User {
    String name;
    Optional<Integer> age;

    public User(String name, Optional<Integer> age) {
        this.name = name;
        this.age = age;
    }
}

class OptionalTypeAdapter<T> implements JsonDeserializer<Optional<T>>, JsonSerializer<Optional<T>> {
    @Override
    public Optional<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
        return json.isJsonNull() ? Optional.empty() : Optional.of(context.deserialize(json, ((Optional<?>) typeOfT).getClass().getComponentType()));
    }

    @Override
    public JsonElement serialize(Optional<T> src, Type typeOfSrc, JsonSerializationContext context) {
        return src.isPresent() ? context.serialize(src.get()) : JsonNull.INSTANCE;
    }
}

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Optional.class, new OptionalTypeAdapter<>())
                .create();

        String json = "{\"name\":\"정민수\",\"age\":null}";
        User user = gson.fromJson(json, User.class);
        System.out.println(user.name + ", " + user.age.orElse(-1));

        String serialized = gson.toJson(user);
        System.out.println(serialized); // {"name":"정민수","age":null}
    }
}

Records와 Gson의 사용 사례 (Java 16 이상)
Java 16부터 도입된 Record는 불변 객체를 간단하게 정의할 수 있는 기능입니다. Gson과 Records를 사용하면 데이터 모델을 더욱 간결하게 작성할 수 있습니다.

1. Record를 사용한 JSON 처리
Records는 자동으로 생성자와 getter를 제공하므로 Gson과 잘 통합됩니다.

import com.google.gson.Gson;

record User(String name, int age) {}

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"조수민\",\"age\":35}";

        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        System.out.println(user.name() + ", " + user.age());

        String serialized = gson.toJson(user);
        System.out.println(serialized); // {"name":"조수민","age":35}
    }
}

2. Record와 리스트 데이터
Record를 리스트 데이터와 결합하면 JSON 데이터를 효율적으로 관리할 수 있습니다.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<User> users = List.of(new User("한지원", 40), new User("김혜린", 32));

        Gson gson = new Gson();
        String json = gson.toJson(users);
        System.out.println(json); // [{"name":"한지원","age":40},{"name":"김혜린","age":32}]

        User[] deserialized = gson.fromJson(json, User[].class);
        for (User user : deserialized) {
            System.out.println(user.name() + ", " + user.age());
        }
    }
}

참고사이트

반응형