Gson 을 이용하여 JsonUtil을 만들어 보았다.

object mapping 과 object to Json

JsonObject 혹은 Json String에서 값 얻어오기 등 지원

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

JsonUtil

method list

public static T fromJson(String json, Class clazz)

  • object mapping from Json String to class

public static String toJson(T obj)

  • class to Json String

public static JsonObject parse(String json)

  • Json String to JsonObject

public static String getValue(JsonObject object, String key)

  • get String value of key from JsonObject
  • Support chained key
    • key1.key2.key3
  • Support array index
    • arrKey[10]
    • arrKey[0][2]
  • It can throw NumberFormatException, IndexOutOfBoundsException

public static String getValue(String jsonStr, String key)

  • get String value of key from Json String

public static int getValueAsInteger(String jsonStr, String key)

  • get int value of key from Json String

public static int getValueAsInteger(JsonObject jsonObj, String key)

  • get int value of key from JsonObject

public static long getValueAsLong(String jsonStr, String key)

  • get long value of key from Json String

public static long getValueAsLong(JsonObject jsonObj, String key)

  • get long value of key from JsonObject

public static double getValueAsDouble(JsonObject jsonObj, String key)

  • get double value of key from JsonObject

public static double getValueAsDouble(String jsonStr, String key)

  • get double value of key from Json String

public static float getValueAsFloat(JsonObject jsonObj, String key)

  • get float value of key from JsonObject

public static float getValueAsFloat(String jsonStr, String key)

  • get float value of key from Json String

public static boolean getValueAsBoolean(String jsonStr, String key)

  • get boolean value of key from Json String

public static boolean getValueAsBoolean(JsonObject jsonObj, String key)

  • get boolean value of key from JsonObject

public static boolean contain(String jsonStr, String key)

  • check the key is in the Json String

public static boolean contain(JsonObject jsonObj, String key)

  • check the key is in the JsonObject

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

 

개발을 하다보면 json을 통해서 정보전달을 하는 경우가 많다. 그 때 gson, jackson 등 여러가지가 library를 취향껏 사용하면 되는데, 오늘은 google에서 나온 gson을 이용한 object mapping을 설명하겠다.

 

1. gradle에 gson 추가

먼저, gson 을 사용하기 위해서 gradle에 추가해야 한다.

최신 gson은 아래 링크를 통해 확인 가능하고..

https://mvnrepository.com/artifact/com.google.code.gson/gson

 

Maven Repository: com.google.code.gson » gson

 

mvnrepository.com

이 글을 쓰는 현재 최신 버젼인 2.8.6을 활용 한다.

 

compile group: 'com.google.code.gson', name: 'gson', version: '2.8.6'

 

추가 하고 gradle sync 를 하면 완료

 

2. class 만들기

json을 class로 만들거나, class를 json으로 object mapping 시키기 위해서 우선 대상 class를 만든다.

간략히 아래와 같이 생성...

toString()은 확인을 위해 만든거라서 없어도 무방하다..

 

public class Animal {
    private int nLeg;
    private String name;

    @Override
    public String toString() {
        return "Animal[nLeg: " + nLeg + ", name: " + name + "]";
    }
}

 

3. Object mapping 하기

object mapping을 하기 위한 method는 2가지, fromJson / toJson 이다.

json -> object 는 fromJson

object -> json 은 toJson

 

매우 간단하다.

 

code로 보면 아래와 같다...

String에서 " 큰따옴표를 사용하려면 \" 를 사용해야 함을 유의!!

public class AnimalTest {

    @Test
    public void testJson() {
        Gson gson = new Gson();

        String json = "{\"nLeg\":4, \"name\": \"Bill\"}";
        Animal animal = gson.fromJson(json, Animal.class);
        System.out.println(animal);

        String reJson = gson.toJson(animal);
        System.out.println(reJson);
    }
}

 

결과는?

 

Animal[nLeg: 4, name: Bill]
{"nLeg":4,"name":"Bill"}

 

4. key 이름 변경

본인은 헝가리안 표기법을 좋아하지는 않지만, 개발조직의 coding convention상 m 이나, n 혹은 i 등을 prefix로 사용하여 class의 멤버이름을 설정해 주어야 하는 경우가 있다.

gson을 그냥 활용할 경우 class의 멤버 이름을 그대로 json의 key로 mapping 시키기 때문에, 위의 예제에 nLeg 같은 key를 사용해야 한다. 

멤버의 이름 말고 json key이름을 지정하는 방법은 gson에서 제공하는 annotation으로 해결 가능하다.

사용할 annotation은 @SerializedName("key 이름")

 

2번의 class를 아래와 같이 수정 하고 

 

import com.google.gson.annotations.SerializedName;

public class Animal {
    @SerializedName("legs")
    private int nLeg;

    @SerializedName("name")
    private String name;

    @Override
    public String toString() {
        return "Animal[nLeg: " + nLeg + ", name: " + name + "]";
    }

}

 

3번의 test code에서 json 의 key이름을 수정하여 다시 실행 해보면...

 

public class AnimalTest {

    @Test
    public void testJson() {
        Gson gson = new Gson();

        String json = "{\"legs\":4, \"name\": \"Bill\"}";
        Animal animal = gson.fromJson(json, Animal.class);
        System.out.println(animal);

        String reJson = gson.toJson(animal);
        System.out.println(reJson);
    }
}

legs 를 key로 사용해도 nLeg 변수에 값이 들어가고, 해당 class를 다시 json 화 했을 때도 지정한 key인 legs 로 바뀌는 것을 알 수 있다.

Animal[nLeg: 4, name: Bill]
{"legs":4,"name":"Bill"}

 

위의 code는 아래 github에서 확인 가능하다.

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

+ Recent posts