2013년 5월 30일 목요일

[Java] Json는 Gson으로...(서버부터 안드로이드까지)

Android App을 개발하면서 정말 많이 쓰는 기술 가운데 하나가 Json 처리 입니다. 예전에는 XML을 많이 사용 하였는데 요세는 XML보다는 가벼운 Json을 많이 사용 하는거 같습니다. 저는 주로 Android에서만 작업을 하기 때문에 Json 처리를 별도의 라이브러리를 사용하지 않고 JsonObeject 와 JsonArray를 사용하여 개발해 왔었습니다. 그러던 중에 간단한 테스트를 하려고 제 데스크탑에 서버 설정을 하면서 Gson을 처음 사용해 봤는데 정말 편하고 좋았습니다. 다만 서버개발자와 서로 맞춰야 될게 몇가지가 있습니다.

먼저 Gson을 사용 하려면 라이브러리를 받아서 등록해야 됩니다. 서버든 Android든 라이브러리 등록 방법은 따로 설명드리지 않겠습니다. 서버에서 Gson을 사용하여 Json형태로 만드는 방법과  Android에서 Gson을 사용하여 Json 을 처리하는 과정을 순차적으로 포스팅 하겠습니다.

Gson 라이브러리 다운로드
Gson User Guide

서버 Gson
public class Intro {
 private int nIndex;
 private String nFirstName;
 private String nSecondName;
 private String nThirdName;
 
 public Intro(int nIndex, String nFirstName, String nSecondName,
   String nThirdName) {
  this.nIndex = nIndex;
  this.nFirstName = nFirstName;
  this.nSecondName = nSecondName;
  this.nThirdName = nThirdName;
 }
}
public class Intros {

 public ArrayList names = new ArrayList();

}
  String json = null;
  String[] nName = {"ㄱ","ㄴ","ㄷ","ㄹ","ㅁ","ㅂ","ㅅ","ㅇ","ㅈ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"};
  Gson gson = new GsonBuilder().setPrettyPrinting().create();
//  Gson gson = new Gson();
  Intros model = new Intros();
  
  for (int i = 0; i < nName.length; i++) {
   model.names.add(new Intro(i, nName[i], nName[i], nName[i]));
  }
  json = gson.toJson(model);
  System.out.println(json);

대략적인 소스 설명을 하면 Intro bean 객체에 데이터를 넣어서 names라는 ArrayList<intro>에 넣습니다. Gson에서는 데이터를 만들때는 toJson(object) 메서드를 사용합니다. 이러면 Json포맷이 만들어 졌습니다. 정말 간단하게 Json을 만들 수 있는걸 볼 수 있습니다. Gson의 생성 방법은 2가지가 있습니다. new GsonBuilder().setPrettyPrinting().create();와 같이 생성하면 Json양식이 갈끔하게 보이게 되고 new Gson();으로 생성하게 되면 보통의 Json 처럼 직렬로 보이게 됩니다.

GsonBuilder().setPrettyPrinting().create() 로 생성
{
  "names": [
    {
      "nIndex": 0,
      "nFirstName": "ㄱ",
      "nSecondName": "ㄱ",
      "nThirdName": "ㄱ"
    },
    {
      "nIndex": 1,
      "nFirstName": "ㄴ",
      "nSecondName": "ㄴ",
      "nThirdName": "ㄴ"
    },
    {
      "nIndex": 2,
      "nFirstName": "ㄷ",
      "nSecondName": "ㄷ",
      "nThirdName": "ㄷ"
    },
    ......... 이하 생략 .........
  ]
}

new Gson()로 생성
{"names":[{"nIndex":0,"nFirstName":"ㄱ","nSecondName":"ㄱ","nThirdName":"ㄱ"},{"nIndex":1,"nFirstName":"ㄴ","nSecondName":"ㄴ","nThirdName":"ㄴ"},{"nIndex":2,"nFirstName":"ㄷ","nSecondName":"ㄷ","nThirdName":"ㄷ"},    

......... 이하 생략 .........

{"nIndex":13,"nFirstName":"ㅎ","nSecondName":"ㅎ","nThirdName":"ㅎ"}]}


Gson 라이브러리를 이용하여 Json 포맷을 만드는 코드를 살펴 보았으니 이제 Android에서 Gson 라이브러리를 이용하여 Json 포맷의 데이터를 어떻게 사용하는지 포스팅하겠습니다.
Gson을 사용할때 한가지 주의 사항은 위에서도 언급했듯이 서버와 클라이언트가 서로 맞추어야 되는 부분이 있습니다. 바로 Namming입니다. ArrayList<Name>를 만들때는 서버에서 사용하고 있는 변수명인 names로 맞춰주고 Bean 파일의 변수명도 서버와 동일하게 맞춰 줍니다. ArrayList<Name>의 변수명이 서버와 다른 경우 데이터가 ArrayList<Name>에 들어가지 않습니다.

Android Gson
public class Name { 
 private int nIndex;
 private String nFirstName;
 private String nSecondName;
 private String nThirdName;
 
 public int getnIndex() {
  return nIndex;
 }
 public void setnIndex(int nIndex) {
  this.nIndex = nIndex;
 }
 public String getnFirstName() {
  return nFirstName;
 }
 public void setnFirstName(String nFirstName) {
  this.nFirstName = nFirstName;
 }
 public String getnSecondName() {
  return nSecondName;
 }
 public void setnSecondName(String nSecondName) {
  this.nSecondName = nSecondName;
 }
 public String getnThirdName() {
  return nThirdName;
 }
 public void setnThirdName(String nThirdName) {
  this.nThirdName = nThirdName;
 }
}
public class Names {
 private ArrayList names = new ArrayList();
 public ArrayList getnList() {
  return names;
 }
 public void setnList(ArrayList names) {
  this.names = names;
 }
}
 String introJson = HttpConnecter.getJson(url주소);
 FLLog.e(TAG, "introJson : " + introJson);
   
 this.mNames = new Gson().fromJson(introJson, Names.class);
 FLLog.e(TAG, "mNames : " + mNames.getnList().size()); 
Bean파일을 보면 변수명은 똑같은걸 확인 할 수 있습니다. 다만 서버에서는 데이터를 넣기만 하면 되기때문에 생성자에서 세팅되게 하였으며 Android에서는 가져다가 써야 하므로 Getter and Setter를 만들어준 차이 밖에 없습니다. HttpConnecter.getJson(url주소)를 이용하여 Json 데이터를 가지고 옵니다. 소스에서는 보이지 않지만 당연히 Thread를 이용하여 데이터를 가지고 오고 있습니다. 가지고온 데이터는 introJson 이라는 String 변수에 저장을 했습니다. Gson으로 생성된 Json 포맷을 받을때는 formJson(data, format)으로 받으면 됩니다. JsonObject를 사용 할 때 처럼 하나하나 받아주지 않고 이런식으로 한번에 통으로 list에 넣을 수가 있습니다.

댓글 없음:

댓글 쓰기