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());
}
}
}
참고사이트
- Gson 공식 문서: https://github.com/google/gson
- Java 공식 문서: https://docs.oracle.com/en/java/
'JAVA' 카테고리의 다른 글
[JAVA] Gson의 확장과 커스터마이징 (1) | 2024.12.15 |
---|---|
[JAVA] Gson 자주 발생하는 문제와 해결법 (0) | 2024.12.15 |
[JAVA] 실전 프로젝트에서의 Gson 활용 (0) | 2024.12.15 |
[JAVA] Gson과 REST API (0) | 2024.12.15 |
[JAVA] Gson의 제한사항과 문제 해결 (0) | 2024.12.14 |
[JAVA] Gson을 활용한 성능 최적화 (0) | 2024.12.14 |
[JAVA] Gson과 JSON 파싱 (0) | 2024.12.14 |
[JAVA] Gson과 날짜/시간 처리 (0) | 2024.12.14 |