✅ Gson이란?
Json을 파싱하고, 생성하기 위해 구글에서 개발한 오픈소스로 데이터를 처리하는데 높은 수준의 유연성을 제공한다. 내부적으로 리플렉션(Reflection)을 사용하기 때문에 Map을 사용하여 Json을 파싱하는 것보다 가독성있는 코드를 작성할 수 있다.
Spring Framework에 Gson을 적용하려면 의존성(dependency)를 추가해서 사용해야 한다.
[ Maven 설정 ]
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
[ Gradle 설정 ]
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
✅ Gson 활용하기
예제 코드를 통해 Java 객체와 Gson 라이브러리를 활용하여 Json을 파싱 및 생성한다.
[ Java 객체(Object) ]
public class GsonVo {
private String name;
private String desc;
private int age;
}
[ Java 객체로 Json 생성하기 ]
public void getJsonFromObject() {
System.out.println("\n[Call] ====> getJsonFromObject");
GsonVo gsonVo = new GsonVo();
gsonVo.setName("heon9u");
gsonVo.setDesc("자바 객체를 json으로");
gsonVo.setAge(27);
Gson gson = new Gson();
String objectToStr = gson.toJson(gsonVo);
System.out.println(objectToStr);
}
/* 결과
[Call] ====> getJsonFromObject
{"name":"heon9u","desc":"자바 객체를 json으로","age":27}
*/
위 코드를 통해 Java 객체를 Json으로 직렬화(Serialize)가 가능하다. 만약 해당 작업을 Gson 대신 Map으로 한다면, 각각 <key, value> 데이터를 만들어야하기 때문에 코드 줄이 늘어나게 된다.
[ Json을 Java 객체로 만들기 ]
public void jsonToObject() {
System.out.println("\n[Call] ====> jsonToObject");
String json = "{\"name\":\"heon9u\",\"desc\":\"json을 자바 객체로\",\"age\":27}";
Gson gson = new Gson();
GsonVo gsonVo = gson.fromJson(json, GsonVo.class);
System.out.println("name: " + gsonVo.getName() + "\ndesc: " + gsonVo.getDesc() + "\nage: " + gsonVo.getAge());
}
/* 결과
[Call] ====> jsonToObject
name: heon9u
desc: json을 자바 객체로
age: 27
*/
이번에는 반대로 Json을 Java 객체로 만든다. 마찬가지로 Map을 Java 객체로 변경한다면 key에 따른 value를 하나씩 set하거나 Map을 iterator로 읽어야 할 것이다.
[ Json 객체 직접 만들기 ]
public void createDirectJson() {
System.out.println("\n[Call] ====> createDirectJson");
Gson gson = new Gson();
JsonObject obj = new JsonObject();
obj.addProperty("name", "heon9u");
obj.addProperty("desc", "direct");
obj.addProperty("age", 27);
String json = gson.toJson(obj);
System.out.println(json);
Gson gsonBuilder = new GsonBuilder().setPrettyPrinting().create();
json = gsonBuilder.toJson(obj);
System.out.println(json);
}
/* 결과
[Call] ====> createDirectJson
{"name":"heon9u","desc":"direct","age":27}
{
"name": "heon9u",
"desc": "direct",
"age": 27
}
*/
직접 Gson 라이브러리를 이용해 Json을 만드는 경우, 위처럼 데이터를 하나씩 addProperty() 메서드로 추가한다. 별개로 Gson을 생성할 때, GsonBuilder() 를 활용하였다. setPrettyPrinting() 메서드를 포함하여 Gson을 생성한다면 출력 결과처럼 들여쓰기가 추가된 Json을 출력할 수 있다. (setPrettyPrinting() 메서드는 제외해도 된다.)
[ Json 파싱하기 ]
public void parseJson() {
System.out.println("\n[Call] ====> parseJson");
String json = "{\"name\":\"heon9u\",\"desc\":\"json 파싱하기\",\"age\":27}";
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(json);
String name = jsonElement.getAsJsonObject().get("name").getAsString();
String desc = jsonElement.getAsJsonObject().get("desc").getAsString();
int age = jsonElement.getAsJsonObject().get("age").getAsInt();
System.out.println("name: " + name + "\ndesc: " + desc + "\nage: " + age );
}
/* 결과
[Call] ====> parseJson
name: heon9u
desc: json 파싱하기
age: 27
*/
이번에는 Json 내부 데이터에 접근하기 위해 JsonParser를 활용하여 Json을 하나씩 파싱한다. 이때 JsonElement는 JsonObject의 상위 클래스다. (JsonObject가 JsonElement를 상속한 구조) 그래서 JsonElement에서 Json에 접근하기 위해 getAsJsonObject() 메서드로 먼저 호출해야 Json Key에 접근할 수 있다.
이외에도 null을 포함하는 Json Property를 생성하거나 특정 필드를 제외하고 Json을 생성하는 transient 등이 있다. 해당 부분들은 Gson을 깊게 사용하는 경우에 포스팅할 예정이다.
✅ References
https://hianna.tistory.com/629#gson1
https://galid1.tistory.com/501
https://soft.plusblog.co.kr/61
'Developer's_til > 그외 개발 공부' 카테고리의 다른 글
[Java] Optional이란? 개념과 사용법 - 1 (0) | 2022.01.03 |
---|---|
[Design Pattern] 컴포지트 패턴(Composite Pattern)이란 (0) | 2021.12.31 |
[Design Pattern] 템플릿 메서드 패턴(Template Method Pattern)이란 (0) | 2021.12.31 |
[Java] 제네릭(generic)이란? (0) | 2021.12.29 |
[Java] Lambda Expression(람다 표현식) (0) | 2021.12.27 |