Development Note/Android

[Android Java] Gson 사용법 정리

JamesChun 2020. 3. 29. 14:29

안드로이드에서 서버와 통신함에 있어서 Json 포맷이 필수적으로 활용되기때문에 Gson 사용법을 정리하게 되었다.
사실 서버에서 json 규격에 맞게 데이터를 정상적으로 준다면 더 아름답게 캐스팅이 가능하지 이렇게 파싱할 일이 거이 없을 것이다.
혹시라도 만약 이렇게 이중배열 형태를 json 그대로 안주고 "" string 으로 준다면 이 방법을 권합니다.


json data

{
   "statusCode":200,
   "list":"[
      {
         "IBNSeq":4,
         "AppId":200301,
         "StoreList":"Google/Galaxy",
         "Sort":0,
         "IsDel":false,
         "LangList":[
            {
               "Language":23,
               "Title":"afewewf",
               "Contents":"ewafaewf",
               "Images":"https://cdn.amazon.com/200301/202008/P20080703481350230.jpg",
               "Link":"awfefewewa"
            },
            {
               "Language":10,
               "Title":"ewafwef",
               "Contents":"aewfaewf",
               "Images":"https://cdn.amazon.com/200301/202008/P20080703482725303.jpg",
               "Link":"wafewefa"
            }
         ],
         "StartDate":"2020-07-16T06:00:00",
         "EndDate":"2020-11-05T06:55:00",
         "RegDate":"2020-10-13T16:44:43.463"
      },
      {
         "IBNSeq":3,
         "AppId":200301,
         "StoreList":"Google/IOS",
         "Sort":1,
         "IsDel":false,
         "LangList":[
            {
               "Language":23,
               "Title":"test",
               "Contents":"tesestagaew",
               "Images":"https://cdn.amazon.com/200301/202008/P20080703484426532.jpg",
               "Link":"urlurlurl"
            },
            {
               "Language":10,
               "Title":"fewa",
               "Contents":"eafw",
               "Images":"https://cdn.amazon.com/200301/202008/P20080703484933609.jpg",
               "Link":"urlurlurlurl"
            }
         ],
         "StartDate":"2020-07-23T06:00:00",
         "EndDate":"2020-11-29T06:15:00",
         "RegDate":"2020-10-13T16:45:00.463"
      }
   ]"
}

클래스 구조

public class RespAppImageBanner {

    @SerializedName("IBNSeq")
    @Expose
    public int IBNSeq;

    @SerializedName("AppId")
    @Expose
    public int AppId;

    @SerializedName("StoreList")
    @Expose
    public String StoreList;

    @SerializedName("Sort")
    @Expose
    public int Sort;

    @SerializedName("IsDel")
    @Expose
    public boolean IsDel;

    @SerializedName("StartDate")
    @Expose
    public String StartDate;

    @SerializedName("EndDate")
    @Expose
    public String EndDate;

    @SerializedName("RegDate")
    @Expose
    public String RegDate;

    @SerializedName("LangList")
    @Expose
    public List<LangList> list = null;

    public class LangList {
        @SerializedName("Language")
        @Expose
        public String Language;

        @SerializedName("Title")
        @Expose
        public String Title;

        @SerializedName("Contents")
        @Expose
        public String Contents;

        @SerializedName("Images")
        @Expose
        public String Images;

        @SerializedName("Link")
        @Expose
        public String Link;
    }
}

파싱하기

// response.body().toString() 이 jsonData
Gson gson = new Gson();
JsonObject info = gson.fromJson(response.body().toString(), JsonObject.class);
Type listType = new TypeToken<List<RespAppImageBanner>>(){}.getType();
List<RespAppImageBanner> imageBannerList = gson.fromJson(info.get("list").getAsString(), listType);
for(RespAppImageBanner item : imageBannerList)
{
    Log.d("http", String.valueOf(item.IBNSeq));
    Log.d("http", String.valueOf(item.AppId));
    Log.d("http", item.StoreList);
    Log.d("http", String.valueOf(item.Sort));
    Log.d("http", String.valueOf(item.IsDel));
    Log.d("http", item.StartDate);
    Log.d("http", item.EndDate);
    Log.d("http", item.RegDate);

    for(RespAppImageBanner.LangList lang : item.list)
    {
        Log.d("http", lang.Language);
        Log.d("http", lang.Title);
        Log.d("http", lang.Contents);
        Log.d("http", lang.Images);
        Log.d("http", lang.Link);
    }
}