출처 - http://newy.tistory.com/9
최근에 안드로이드에서 JSON 데이터를 파싱할 일이 있었다. 처음엔 안드로이드에서 기본으로 제공하는 API 로 코딩을 했다. 기본 API로 코딩을 해보니 불편한 점이 있었다. 이 문제를 해결해주는 외부 라이브러리를 찾다가 Gson을 발견했다.
Gson덕분에 JSON 파싱을 쉽고 간단하게 할 수 있었다. Gson 사용법을 익히면서 알게 된 내용을 공유하기 위해 포스트를 남긴다.
1. 기본 JSON API(org.json.*)의 불편함
1-1. Checked Exception을 던진다
기본 API를 쓰면서 try/catch 문이 가장 불편했다. 대부분 간단한 형식의 JSON 을 쓰기 때문에 예외가 발생할 상황은 거의 없었다. 하지만 기본 API는 Checked Exception을 던지기 때문에 빈 try/catch 문이라도 만들어야 했다. Gson을 사용하면 이런 상황을 피할 수 있다. Gson은 Runtime Exception을 던지기 때문에 필요한 사람만 try/catch문을 만들면 된다.
1-2. JSON 으로 DAO를 만들 때 할 일이 많다
기본 API로 DAO를 만들려면 JSONObject/JSONArray의 get()를 호출해서 값을 읽고, DAO객체에 값을 설정해야한다. 기본 API는 손이 많이 간다. Gson을 사용하면 더 간단하게 코딩할 수 있다.
2. 이클립스에서 Gson 설정하기
2-1. 라이브러리 다운로드 하기
gson-github 홈페이지의 'Gson Downloads'에 나오는 링크를 클릭해서 gson-maven 페이지로 이동한다.
gson-maven 홈페이지의 아래쪽에 배포 가능한 라이브러리 목록이 있다. 알맞은 라이브러리를 다운로드한다.
2-2. 이클립스 프로젝트에 라이브러리 추가하기
Prpject > Properties > Java Build Path > Libraries > 'Add External JARs...'를 선택해서 라이브러리를 추가한다.
2-3. Could not find class ‘com.google.gson.Gson’ 에러 피하기
라이브러리를 추가하고 바로 코딩하면 이런 에러 메시지를 볼 수 있다.
아래처럼 추가 설정을하면 에러를 피할 수 있다.
Prpject > Properties > Java Build Path > Order and Export에서 추가한 Gson라이브러리를 체크한다. (그래도 에러가 발생하면, 'Up 버튼'으로 Gson의 순서를 높여주자.)
3. Gson 사용법
3-1. 단일블록 JSON 파싱하기
Gson 클래스(com.google.gson.Gson)를 사용하면 단일블록(JSON 객체/배열)의 데이터변환(JSON ↔ Java)을 쉽게 할 수 있다. 아래의 예제코드에서 Gson 클래스의 사용법을 보자.
3-1-1. JSON 객체 파싱하기
기본설정으로 Gson을 사용하려면 변수이름을 지을 때 주의해야 한다. JSON객체와 Java객체의 변수이름을 똑같이 만들어야 한다. 예를 들어 JSON객체의 변수이름으로 'phone_number'를 만들었다면 Java객체(Person)의 변수이름도 'phone_number'로 만들어야한다.
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 |
@Test public void jsonToJava() { Gson gson = new Gson(); String json = "{'name':'김태희', 'phone_number':'010-1234-5678'}" ; Person java = gson.fromJson(json, Person. class ); assertEquals( "김태희" , java.name); assertEquals( "010-1234-5678" , java.phone_number); } @Test public void javaToJson() { Gson gson = new Gson(); Person java = new Person( "김태희" , "010-1234-5678" ); String json = gson.toJson(java); assertEquals( "{\"name\":\"김태희\",\"phone_number\":\"010-1234-5678\"}" , json); } static class Person { String name; String phone_number; Person(String name, String phoneNumber) { this .name = name; this .phone_number = phoneNumber; } } |
3-1-2. JSON 배열 파싱하기
1
2
3
4
5
6 |
@Test public void parseArray() { Gson gson = new Gson(); assertArrayEquals( "JSON=>java" , new int [] { 1 , 2 , 3 }, gson.fromJson( "[1,2,3]" , int []. class )); assertEquals( "java=>JSON" , "[1,2,3]" , gson.toJson( new int [] { 1 , 2 , 3 })); } |
3-2. 다중블록 JSON 파싱하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
private static String JSON_DATA = "{'muses':" + "[" + "{'name':'김태희', phone_number='010-1234-5678'}, " + "{'name':'유라'}" + "]" + "}" ; @Test public void twoDepthJsonToJava() { JsonObject root = new JsonParser().parse(JSON_DATA).getAsJsonObject(); JsonArray subnode = root.get( "muses" ).getAsJsonArray(); Gson gson = new Gson(); Person firstGirl = gson.fromJson(subnode.get( 0 ), Person. class ); assertEquals( "김태희" , firstGirl.name); assertEquals( "010-1234-5678" , firstGirl.phone_number); Person secondGirl = gson.fromJson(subnode.get( 1 ), Person. class ); assertEquals( "유라" , secondGirl.name); assertEquals( null , secondGirl.phone_number); } |
[깨알팁] optional data의 기본 값으로 null 대신 빈 문자열 설정하기
위 예제코드에서 JSON 객체는 name과 phone_number라는 변수가 있다. name은 모든 객체가 갖고 있어야하는 '필수 데이터'이고 phone_number는 '옵션(선택적 입력) 데이터'이다.
Gson은 JSON객체에서 Java객체을 만들 때, 갖고 있지 않은 데이터는 기본 값으로 설정한다. int, float 등 primitive type은 0으로 설정하고, reference type은 null로 설정한다. 위의 예제코드에서 secondGirl.phone_number에 null값이 들어가 있는 이유도 이런 규칙 때문이다.
레퍼런스 변수에 null값이 하나라도 들어있으면 null체크 코드를 만들어야 한다. 때때로 null체크 크드를 만들기 귀찮은 순간이 있다. 아래의 예제처럼 코딩하면 null대신 빈 문자열을 기본 값으로 설정할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
@Test public void jsonToJava_setDefaulValueAsNotNull() { Gson gson = new Gson(); String json = "{'name':'유라'}" ; Person2 java = gson.fromJson(json, Person2. class ); assertEquals( "유라" , java.name); assertEquals( "" , java.phone_number); } static class Person2 { String name; String phone_number = "" ; // optional data에 기본값 설정하기 } |
위 코드는 빈 생성자만 있을 때 가능한 구현이다. DAO객체에 파라미터를 받는 생성자가 있다면 아래처럼 코딩해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
@Test public void jsonToJava_setDefaulValueAsNotNull_hasArgsConstructor() { Gson gson = new Gson(); String json = "{'name':'유라'}" ; Person3 java = gson.fromJson(json, Person3. class ); assertEquals( "유라" , java.name); assertEquals( "" , java.phone_number); } static class Person3 { String name; String phone_number; Person3() { this ( null , "" ); // optional data에 기본값 설정하기 } Person3(String name, String phoneNumber) { this .name = name; this .phone_number = phoneNumber; } } |
4. 마치며
지금까지 Gson의 기본 설정만으로 코딩을 했다. 대부분의 경우에 기본 설정만으로 원하는 코딩을 할 수 있을 것이다. 좀 더 많은 기능이 필요한 사람은 Gson User Guide와 Gson API Doc을 읽기를 바란다.
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드 paint 속성 (0) | 2016.01.19 |
---|---|
Android ListView - 구분선(divider) 가로 길이 설정 (0) | 2015.12.01 |
GSON 사용법 (0) | 2015.11.20 |
이클립스(eclipse)에서 C++ 설치 및 간단 사용법(MinGW) (0) | 2015.11.10 |
안드로이드 스튜디오에서 NDK (0) | 2015.10.30 |
댓글