반응형
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 |