IT/Android

Json 파싱 이해하기. (JsonObject, JsonArray, JsonElement)

토마토조아 2018. 11. 8. 14:58
728x90

안드로이드나 자바를 개발하다 보면 Http 통신을 사용해야 하는 경우가 대부분이다.

디바이스 자체에서 알아서 돌아가는 단독앱(Standalone)은 안드로이드 초창기에나 있었고 지금은 자취를 거의 감춘 상태이다.

최소한 광고라도 붙이기 때문에 Http 통신과 관련된 응답(Json, Xml) 처리는 중요하다.

이제 응답 형식도 Json이 보편화되고 있기 때문에 개념을 잘 이해하고 있어야 한다.

 

Json은 JavaScript Object Notation 의 약자이고, 데이터 교환 형식 중 하나이다. Json은 데이터만 봐도 내용을 이해하기 쉽기 때문에 좋다. 각설은 여기까지 하고 Json 파싱을 살펴보자.

 

Json의 형식은 대충 아래와 같다.

jsonObject 내용

 

{

"status":"1",

"message":"OK",

"result":

[

{

"Number":"1",

"Stamp":"A123",

"hash":"0xa8948b23fe3",

"Name":"Apple"

 },

 {

 "Number":"2",

"Stamp":"A124",

"hash":"0xf146b23d537",

"Name":"Lemon"

 }

   ]

}

 

위의 형식을 보게되면 {}, [] 들이 섞여 있고, Key와 Data가 쌍으로 이루어져 있다.

본론만 쉽게 얘기를 하면 위의 Json 데이터를 파싱하기 위해서는 JsonObject, JsonArray, JsonElement 가 모두 필요하다.

 

 

일단 예제 데이터는 통으로 JsonObject 가 된다.

현재의 JsonObject 에는 JsonArray와 JsonElement가 섞여있기 때문에 이 2가지를 분리해야 한다.

 

순서대로 해보자.

status, message 를 파싱해내기 위해서는 최초의 JsonObject 에서 아래와 같이 바로 파싱이 가능하다.

String status = jsonObject.get("status").getAsString();

String message = jsonObject.get("message").getAsString();

 

result의 내용을 파싱하기 위해서는 JsonArray, JsonElement를 이용하자.

result의 {}, {}가 각각의 Array로 받아올 수 있고, 각각의 Array를 Element로 분리할 수 있다.

위의 예제 데이터는 result에 {}가 2개 이기 때문에 size는 2가 되고, 0과 1의 인덱스를 가진 데이터로 나눌 수 있겠다.

각 Element는 Object처럼 생각하고 파싱하게 된다.

JsonArray jsonArray = jsonObject.getAsJsonArray("result");

JsonElement jsonElement1 = jsonArray.get(0);  -> Apple

JsonElement jsonElement2 = jsonArray.get(1);  -> Lemon

String Name1 = jsonElement1.getAsJsonObject().get("Name").getAsString();

String Name2 = jsonElement2.getAsJsonObject().get("Name").getAsString();

 

결과

Name1 = Apple

Name2 = Lemon

 

이런식으로 데이터를 파싱할 수 있다.

JsonObject, JsonArray, JsonElement를 서로 잘 이용하면 대부분의 Json 데이터는 무리없이 파싱이 가능하다.

 

정리하면 데이터의 형식이 아래와 같다.

JsonObject => { {}, {}, [{}, {}, {}] }

JsonArray => [{}, {}, {}]

JsonElement => {}  마치 JsonObject 와 같은 것이 되어버림. 왜냐면 JsonObject 는 모든 데이터 형식을 가질 수 있기 때문에 {} 하나만으로 이루어진 데이터도 JsonObject가 될 수 있다.

JsonElement.getAsJsonObject().get("key value").getAsString();

 

 

 

728x90