조회 수 8425 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print


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 파싱하기

흔히 JSON 으로 데이터를 주고 받을 때 여러 개의 블록으로 묶어서 사용한다. 다중블록 JSON 파싱은 아래 순서대로 하면 된다.
(1) JsonParser로 JSON 의 최상위 노드를 만든다.
(2) [반복] JsonObject/JsonArray로 원하는 노드를 찾는다.
(3) Gson으로 DAO객체를 만든다.

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을 읽기를 바란다.




출처: http://newy.tistory.com/entry/post-2 [뉴와이의 이지코딩]


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
416 일반 마크다운 markdown (.md) 파일이란 2017.07.12 12218 0
415 Pi 아두이노 (Arduino)로 서보모터 (SG90) 제어 2017.07.11 10844 0
414 일반 배치파일(bat)에서 명령 실행결과를 변수에 저장하는 방법 2017.07.05 18832 0
413 LINUX 프로세스를 이름으로 단번에 종료하기 2017.06.07 8566 0
412 C++ istringstream 을 이용한 string type 변환 & 토크나이징 2017.06.07 8613 0
411 LINUX bluetooth on Ubuntu 2017.05.25 13456 0
410 Pi Raspberry pi 에 Bluetooth사용을 위한 bluez설치 및 실행 2017.05.24 9700 0
409 LINUX 블루투스 사용하기 hci tool 2017.05.24 11842 0
408 일반 BT와 BLE 2017.05.16 6526 0
407 LINUX [Shell Script] Bash 파일 유무 체크하는 방법과 파일 존재 검사 옵션 2017.05.16 21235 0
406 LINUX [Shell Script] Bash 실행결과를 변수에 담기 2017.05.16 13401 0
405 Pi SSD1306 OLED Displays with Raspberry Pi 2017.05.10 6633 0
404 Pi SPI란? (Serial Peripheral Interface) 2017.04.20 15469 0
403 Pi LCD interface 종류 및 Driver IC 2017.04.17 6209 0
402 Pi 아두이노의 인터럽트 (interrupt) 사용 2017.04.13 14340 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 11 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5