Gson은 Google에서 개발한 Java 라이브러리로, 자바 객체를 Json 데이터로 변환하거나, 반대로 Json 데이터를 자바 객체로 변환하는 작업을 간편하게 처리할 수 있도록 도와준다.
Gson을 프로젝트에서 사용하려면, Gson 라이브러리의 의존성을 프로젝트에 추가해야 한다. Maven이나 Gradle같은 프로젝트 빌드 도구를 통한 의존성 관리로 Gson을 프로젝트에 추가할 수 있다.
Gradle
dependencies{ implementation 'com.google.code.gson:gson:2.10.1' }
Maven
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
JVM 기반 언어면 사용 가능하므로, Java뿐만 아니라 Kotlin에서도 사용할 수 있다. 다만 이 경우 사용할 클래스를 Java클래스 형식으로 변환해야 한다.
Kotlin 기반 예시
val kotlinObject = Gson().fromJson(json, kotlinBaseClass::class.java)
객체 내부의 변수와 그 값을 Json의 Key와 Value데이터로 변환하는 것을 직렬화라고 한다.
사용하는 함수는 toJson()으로, 기본적인 자료형부터 List, Map, 사용자가 별도로 선언한 객체까지 변환할 수 있다.
toJson()
Gson gson = new Gson(); //객체 class Exam{ int num; String name; ... } Exam examObject = new Exam(2023,"examName"); String objectBaseJson = gson.toJson(examObject); //Map Map<String,Integer> examMap = new LinkedHashMap<>(); map.put("Key1",1); map.put("key2",2); String mapBaseJson = gson.toJson(examMap);
결과
객체 기반 Json: {"num":2023,"name":"examName"} map 기반 Json: {"key1":1,"key2":2}
직렬화와는 반대로, Json의 Key의 이름과 일치하는 변수에 Value의 값을 할당하여 객체로 변환하는 것을 역직렬화라고 한다.
사용하는 함수는 fromJson()이다.
참고로, Json 데이터의 Key 순서는 역직렬화에 영향을 주지 않는다.
Gson은 Key의 이름과 변수명이 일치하는지 확인하고, 일치하지 않더라도 Key와 변수 간의 매핑을 기반으로 데이터를 올바르게 역직렬화하므로 객체화가 실패하지 않는다.
fromJson()
Gson gson = new Gson(); //객체 class Exam{ //위의 예시와 같음 } //key 위치가 다른 json문자열 String examJson1 = "{\"name\":\"jsonName\", \"num\":11}"; Exam resultObject = gson.fromJson(examJson1,Exam.class); //Map String examJson2 = "{\"key1\":1, \"key2\":2}"; Map<String,Integer> resultMap = Gson().fromJson(examJson2,Map.class);
결과
resultObject.num = 11 resultObject.name = jsonName resultMap.get("key1") = 1 resultMap.get("key2") = 2
Gson()을 통해서도 객체와 Json을 다룰 수 있지만, GsonBuilder()를 이용하면 보다 자세히 설정하여 다루는 것이 가능하다.
기본 사용
Gson gsonUsingBuilder = new GsonBuilder().create();
Gson은 HTML문자로 인식되는 부분을 유니코드로 변환한다.
해당 부분을 그대로 전달하고자 할 때, disableHtmlEscaping()을 사용한다.
disableHtmlEscaping()
Gson gsonUsingBuilder = new GsonBuilder() .disableHtmlEscaping() .create(); class Exam{ //위의 예시와 같음 } Exam examObject = new Exam(1988,"<containHTMLCharacters>"); String resultJson = gsonUsingBuilder.toJson(examObject);
결과
{"num":1988,"name":"<containHTMLCharacters>"}
Gson은 직렬화 과정에서 null인 모든 변수를 생략한다.
null을 누락시키고 싶지 않을 때, serializeNulls()을 사용한다.
serializeNulls()
Gson gsonUsingBuilder = new GsonBuilder() .serializeNulls() .create(); class Exam{ //위의 예시와 같음 } Exam containNullObject = new Exam(null,"numIsNull"); String resultJson = gsonUsingBuilder.toJson(containNullObject);
결과
{"num":null,"name":"numIsNull"}
직렬화에만 영향을 주는 함수로, Json 문자열에 자동으로 들여쓰기와 줄내림을 적용하여 가독성을 향상시킨다.
serializeNulls()
Gson gsonUsingBuilder = new GsonBuilder() .setPrettyPrinting() .create(); class Exam{ //위의 예시와 같음 } Exam examObject = new Exam(5252,"looksPretty"); String resultJson = gsonUsingBuilder.toJson(examObject);
결과
{ "num":5252, "name":"looksPretty" }