Gson은 Json을 객체로 다루기 위한 라이브러리이다.
Gson은 Object mapping 방식 말고도, Json자체를 JsonObject라는 class로 만들어서 Json내에 object, 값, 배열,null 을 가져오거나, 추가, 삭제 등을 할 수 있다.
먼저 JsonObject에서는 Json의 요소를 구분하는 총 5가지 종류의 class가 있다.
JsonElement, JsonObject, JsonPrimitive, JsonArray, JsonNull
1. JsonElement
위의 다섯가지 중 JsonElement를 제외한 4가지는 JsonElement를 상속한다.
즉, JsonElement는 나머지 4가지의 부모class로 추상클래스로 정의되어 있다.
기본적으로 getter를 통해서 Json의 요소를 가져오면 기본적으로 JsonElement 형태로 받아오며, 필요에 따라서 적절히 변환해서 사용해야 한다.
2. JsonObject
Json에서 중괄호로 묶여서 하나의 Object를 나타낼때, 그것을 표현하기 위한 class
당연히 key-value형태로 존재하며, 실제 구현은 LinkedTreeMap으로 구현되어 있다.
3. JsonPrimitive
Json에서 특정 key의 value값을 나타내기 위한 class,
숫자, 문자, Boolean 등 의 실제 값을 저장한다.
4. JsonArray
Json에서 [] 로 묶여서 배열을 나타내기 위한 class
index로 접근 가능하며, 실제 List와 유사하다.(알고보니 구현체도 ArrayList로 구현되어 있군...)
5. JsonNull
null object를 표현하기 위한 class
아래 Test code를 이용해서 확인 가능하다..
public class GsonTest {
@Test
public void testJsonObject() {
String json =
"{" +
" strKey : strValue, " +
" numKey: 235, " +
" arrKey: [arrV1, arrV2, arrV3]," +
" objKey: {subKey: subValue}," +
" numArrKey: [100, 200, 300]," +
" nullKey: null" +
"}";
JsonObject jsonObj = (JsonObject) JsonParser.parseString(json);
System.out.println(jsonObj.isJsonPrimitive());
System.out.println(jsonObj.isJsonObject());
System.out.println(jsonObj.isJsonArray());
System.out.println(jsonObj.isJsonNull());
System.out.println(jsonObj.toString());
System.out.println("=============== strKey ===============");
JsonElement element = jsonObj.get("strKey");
System.out.println(element.isJsonPrimitive());
System.out.println(element.isJsonObject());
System.out.println(element.isJsonArray());
System.out.println(element.isJsonNull());
System.out.println(element.toString());
System.out.println("=============== numKey ===============");
element = jsonObj.get("numKey");
System.out.println(element.isJsonPrimitive());
System.out.println(element.isJsonObject());
System.out.println(element.isJsonArray());
System.out.println(element.isJsonNull());
System.out.println(element.toString());
System.out.println("=============== arrKey ===============");
element = jsonObj.get("arrKey");
System.out.println(element.isJsonPrimitive());
System.out.println(element.isJsonObject());
System.out.println(element.isJsonArray());
System.out.println(element.isJsonNull());
System.out.println(element.toString());
System.out.println("=============== objKey ===============");
element = jsonObj.get("objKey");
System.out.println(element.isJsonPrimitive());
System.out.println(element.isJsonObject());
System.out.println(element.isJsonArray());
System.out.println(element.isJsonNull());
System.out.println(element.toString());
System.out.println("=============== nullKey ===============");
element = jsonObj.get("nullKey");
System.out.println(element.isJsonPrimitive());
System.out.println(element.isJsonObject());
System.out.println(element.isJsonArray());
System.out.println(element.isJsonNull());
System.out.println(element.toString());
}
}
실행 결과는...
false true false false {"strKey":"strValue","numKey":235,"arrKey":["arrV1","arrV2","arrV3"],"objKey":{"subKey":"subValue"},"numArrKey":[100,200,300],"nullKey":null} =============== strKey =============== true false false false "strValue" =============== numKey =============== true false false false 235 =============== arrKey =============== false false true false ["arrV1","arrV2","arrV3"] =============== objKey =============== false true false false {"subKey":"subValue"} =============== nullKey =============== false false false true null |
기본적으로 Json String을 JsonObject로 받기 위해서는 JsonParser.parseString() method를 이용해야 한다.
(해당 method는 static이므로, 걍 사용하면 된다.)
참고로 parseString의 return 은 JsonElement 이므로 변환해야 JsonObject로 받을 수 있다.
@Test
public void testJsonParse() {
String json =
"{" +
" strKey : strValue, " +
" numKey: 235, " +
" arrKey: [arrV1, arrV2, arrV3]," +
" objKey: {subKey: subValue}," +
" numArrKey: [100, 200, 300]," +
" nullKey: null" +
"}";
JsonObject jsonObj = (JsonObject) JsonParser.parseString(json);
jsonObj = JsonParser.parseString(json).getAsJsonObject();
}
코드를 보면 알 수 있듯이 get("key")을 통해서 얻어온 값은 JsonElement이고 이를 isJsonXXX() 를 통해서 어떤 종류인지 확인 한후 getAsXXX()을 통해 변환후 사용해야 한다.
@Test
public void testJsonConvert(String json) {
JsonElement elem = JsonParser.parseString(json);
if (elem.isJsonPrimitive()) {
JsonPrimitive primitive = elem.getAsJsonPrimitive();
// logic for JsonPrimitive
} else if (elem.isJsonArray()) {
JsonArray array = elem.getAsJsonArray();
// logic for JsonArray
} else if (elem.isJsonObject()) {
JsonObject object = elem.getAsJsonObject();
// logic for JsonObject
} else if (elem.isJsonNull()) {
JsonNull jsonNull = elem.getAsJsonNull();
// logic for JsonNull
}
}
'MEDIUMTEXT' 카테고리의 다른 글
git에서 merge commit을 revert 하는 방법 (0) | 2024.10.01 |
---|---|
Gson을 이용한 직렬화/역직렬화 (toJson / fromJson) (0) | 2024.09.29 |
git에서 다른 repository에 있는 commit을 cherry-pick 해오는 방법 (0) | 2024.09.28 |
Kotlin class 선언 방법 (0) | 2024.09.21 |
Kotlin class 생성자 정리 (0) | 2024.09.21 |