https://github.com/jeng832/blog-example/tree/master/gson2

 

jeng832/blog-example

Contribute to jeng832/blog-example development by creating an account on GitHub.

github.com

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
        }
    }

 

+ Recent posts