반응형

 

붱이 Story

안드로이드에서 json 파싱 노가다를

아주 간단히 한 두줄로 끝낼수 있는 강력한 방법

GSON

Gson?

Gson에 대해 알아보자

상세 설명은 링크로 대체 ㅎㅎ

너무 설명을 잘하셔서...

http://emflant.tistory.com/47

 

내가 처음 GSON 을 알고

사용법을 익히기위해

찾아본 blog에는

솔직히 너무 기본적인 내용밖에 없었다

이런느낌?

 

<PPT를 만들기법>

ppt를 띄운다

제목란에 제목을 쓴다

내용에 내용을 쓴다.

 

실전에 활용하기엔 역부족

 

요근래 GSON에 대해서 문의가 많이 들어와서

설명해주기 힘들었었다.

정리해두면 다른 사람들이 또 질문했을때 유용할듯

 

예제설명을 위한 가상 app을 예제로 설명을 해보려한다.

(추후 만들예정)
 

은쟈 요구사항(실제 몇달전 요청했었다)


"화장품 사면 유효기간이 언제까지인지 까먹다가 못쓰는 화장품이 많은데

앱에 유효기간을 저장해두고 시간이되면 알려주는 앱 만들어주면 안되?"

 

생각해보니 나도 쿠폰 같은거 받아두고

그전에 써야지 생각하고 보면 이미 유효기간 아웃..

해서 화장품뿐만 아니라 쿠폰, 가전제품 등의

유효기간 이나 A/S 기간이 있는 것들에 대해서 확장하여 구상을 했다.
   

앱에서 보여줄 필요한 정보들

예시

> Category
  전자제품
  가구
  화장품
  음식
  약제
  쿠폰
  + 사용자 얼마든지

> Item
  분류 : Category중에 하나꼭 선택
  제품명 : 다이슨 선풍기 AM-07
  생성일 : 만든날 또는 구입일
  만료일 : 유효기간 or A/S기간
  제품 img : list형태
  영수증img : list형태
  대표 img : 제품 img중에 하나 선택하게
  알람 : 만료기간 몇일전 알람

 

Json Sample에 대응되는 class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    // 여기서 final은 상속불가를 위해 선언
    public final class ExpireData {
        // @SerializedName의 값은 json에서 Object로 파싱 되어질 때 key의 name이다.
        // 변수명은 달라도 된다. 이왕이면 같게
        // Catetory 리스트 Type이 Category로 되어있다
        public @SerializedName("categories") ArrayList<Category> categories; 
        // Item 리스트 Type이 Item으로 되어있다
        public @SerializedName("items") ArrayList<Item> items;
 
        // inner class는static으로 
        // 위 categories에 들어갈 Category Class
        public static final class Category {
            public @SerializedName("name"String name;
            public @SerializedName("icon"String icon;
 
            public Category(String name, String icon) {
                this.name = name;
                this.icon = icon;
            }
        }
 
        // 위 items에 들어갈 Item Class
        public static final class Item {
            public @SerializedName("name"String name;
            public @SerializedName("category"String category;
            public @SerializedName("createDate"String createDate;
            public @SerializedName("expireDate"String expireDate;
            // 제품 이미지는 여러장이 될수 있기 때문에 ArrayList
            public @SerializedName("productImgs") ArrayList<String> productImgs; 
            public @SerializedName("receiptImg"String receiptImg;
            public @SerializedName("alarm"String alarm;
 
            public Item(String name, String category, String createDate, String expireDate,
                    ArrayList<String> productImgs, String receiptImg, String alarm) {
                this.name = name;
               this.category = category;
                this.createDate = createDate;
                this.expireDate = expireDate;
                this.productImgs = productImgs;
                this.receiptImg = receiptImg;
                this.alarm = alarm;
           }
        }
   }
cs

 

test용도이니 getter setter 및 생성자는

개발자 입맛에 맞게 변경~~

 

Json Sample

 

json 이쁘게 node로 볼수 있는 사이트
http://jsonviewer.stack.hu/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "categories": [
    {
      "name""Electronic",
      "icon""electronicIcon.png"
    },
    {
      "name""Cosmetic",
      "icon""cosmeticIcon.png"
    },
    {
      "name""Food",
      "icon""foodIcon.png"
    }
  ],
  "items": [
    {
      "name""TV",
      "category""Electronic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png",
        "productimg02.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15 09:00"
    },
    {
      "name""Founder",
      "category""Cosmetic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15 AM 9:00"
    },
    {
      "name""Water melon",
      "category""Food",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "productImgs": [
        "productimg01.png",
        "productimg02.png",
        "productimg03.png"
      ],
      "receiptImg""receipt.png",
      "alarm""2018-05-15AM9: 00"
    }
  ]
}
cs

 

 

 

ExpireData 생성

 

 

1
2
3
4
5
6
7
//사용자가 입력한 값들을expireData에 담는다
ExpireData expireData = new ExpireData();
expireData.categories.add(new ExpireData.Category("Electronic""electronicIcon.png"));
ArrayList<String> productsImgs = new ArrayList<>();
productsImgs.add("productimg01.png");
productsImgs.add("productimg02.png");
expireData.items.add(new ExpireData.Item("TV""Electronic""2017-06-01""2018-06-01", productsImgs
cs


 

Gson을 이용한 ExpireData to json

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Gson gson = new Gson();
String json = gson.toJson(expireData);
 
//결과 
{
  "categories": [
    {
      "icon""electronicIcon.png",
      "name""Electronic"
    }
  ],
  "items": [
    {
      "alarm""2018-05-15 09:00",
     "category""Electronic",
      "createDate""2017-06-01",
      "expireDate""2018-06-01",
      "name""TV",
     "productImgs": [
        "productimg01.png",
        "productimg02.png"
      ],
     "receiptImg""receipt.png"
    }
  ]
}
cs

 

이경우는 사용자가 입력한 data를

json파일로 저장할때 쓰인다.

저장한 json은 app이 로딩될때

아래와 같은 방법으로 파싱되어

app에서 보여질수 있다~

 

 

Gson을이용한 json to ExpireData

 

1
2
3
// 단 두줄로... json을 parsing 하여 Object에 바로 담아준다
Gson gson = new Gson();
ExpireData getExpireData = gson.fromJson(json, ExpireData.class);
cs

 

app에서 기존 저장된 json data를

불러올때 쓰거나

 server에서 받아온 json을

정해진 class타입에 맞게 파싱할때 쓰인다.

위에 설명해준 @SerializedName 의 값에 의해

 파싱이 되니 꼭 이름이 같아야한다!!

 

문의사항은 댓글남겨주세요

 

※ 공감 및 댓글 한마디는 포스팅하는데 큰 힘이 됩니다.

반응형

+ Recent posts