본문 바로가기

Android

JSON을 GSON으로 쓰는 방법.

보통 파싱을 하게 되면 xml을 많이 생각하게 되는데 JSON보다는 GSON이 사용하기 더 편한 것 같다.(깨닫고 나니깐....)

하지만 GSON이 다 좋은것만은 아니라고 느껴지는 것이 [~]이런 종류의 내용은 JSON에서 읽기 좋지만 GSON에서는 최악인

것 같다. (실제로 [~]식으로 예제 작성하다가 하루를 날로 바치는 마술을 보았다 -_-;)

GSON으로 배열 형식을 쓰고 싶다면 {"key":[~]}이런식으로 작성하는 것이 바람직하다.

먼저 아래와 같은 JSON이 있다고 치자.

String Json =
"{\"computer\":[{\"Product\":\"mouse\",\"Maker\":\"Samsung\",\"Price\":23000},"

+"{\"Product\":\"keyboard\",\"Maker\":\"LG\",\"Price\":12000},"

+"{\"Product\":\"hdd\",\"Maker\":\"westorn digital\",\"Price\":15600}]}"; 

배열인데 이것을 JSON으로 파싱을 하면 다음 예제 처럼 할 수 있다. 

public class JSONobj extends Activity implements OnClickListener {

private TextView txt;

private Button btn;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.jsonobj);


txt = (TextView) findViewById(R.id.txt_json);

btn = (Button) findViewById(R.id.btn_json);


btn.setOnClickListener(this);

}

public void onClick(View v) {

// TODO Auto-generated method stub

switch(v.getId()){

case R.id.btn_json:

String Json = "{\"computer\":[{\"Product\":\"mouse\",\"Maker\":\"Samsung\",\"Price\":23000},"

+"{\"Product\":\"keyboard\",\"Maker\":\"LG\",\"Price\":12000},"

+"{\"Product\":\"hdd\",\"Maker\":\"westorn digital\",\"Price\":15600}]}";

try{

String txt1 = "주문 목록\n";


JSONArray ja = new JSONArray(Json);

for(int i =0; i < ja.length(); i++){

JSONObject obj = ja.getJSONObject(i);

txt1 += "제품명:"+obj.getString("Product"

+ ",제조사:"+obj.getString("Maker")

+",가격:"+obj.getInt("Price")+"\n";

}

txt.setText(txt1);

}catch(Exception e){

txt.setText(e.getMessage());

}

break;

}




안드로이드로 짠 소스로 JSONArry에서 반복문을 통해 JSONObject를 통해서 하나하나 꺼낸 형식이다. 이것을 GSON으로 바

꿔보자. GSON을 쓰기 위해서는 google에서 GSON 라이브러리를 가져와서 빌드Path에 집어넣어준다.

기본적으로 사용하는 method는 단 두개 formJson과 toJson이다. 자 그럼 위의 소스를 GSON으로 변환한 것이다. 설명은 주석

으로 대신하겠음. 주의사항이 있다면 Json 내용의 키와 값과 새로 만든 클래스에서 만드는 변수명을 다르게 하면 안된다.
(이것땜에 하루 다보냄)
 
package com.tistory.sunwoont;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;

import com.google.gson.Gson;

public class JSONobj extends Activity implements OnClickListener {
private TextView txt;
private Button btn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.jsonobj);

txt = (TextView) findViewById(R.id.txt_json);
btn = (Button) findViewById(R.id.btn_json);

btn.setOnClickListener(this);

}

public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.btn_json:
String Json = "{\"computer\":[{\"Product\":\"mouse\",\"Maker\":\"Samsung\",\"Price\":23000},"
+"{\"Product\":\"keyboard\",\"Maker\":\"LG\",\"Price\":12000},"
+"{\"Product\":\"hdd\",\"Maker\":\"westorn digital\",\"Price\":15600}]}";
try{
String txt1 = "주문 목록\n";
Gson gson = new Gson();//Gson 객체 및 인스턴스 생성.
Prod prod = gson.fromJson(Json, Prod.class);//다른 클래스(InnerClass)를 생성하여
//그곳에 Json문서를 넣음.
for(Item item : prod.getComputer()){//for문을 돌려서 각각에 맞는 배열 name의 값을 추
txt1 += "제품명:"+item.getProduct() + ",제조사:"+item.getMaker()
+",가격:"+item.getPrice()+"\n";
}
txt.setText(txt1);
}catch(Exception e){
txt.setText(e.getMessage());
}
break;
}
}
//배열 키값에 대한 내용..
public class Prod{
private ArrayList<Item> computer;

public ArrayList<Item> getComputer() {
return computer;
}

public void setComputer(ArrayList<Item> computer) {
this.computer = computer;
}
}
//배열에 있는 내용. 배열명
public class Item{
private String Product;
private String Maker;
private Integer Price;
public String getProduct() {
return Product;
}
public void setProduct(String product) {
Product = product;
}
public String getMaker() {
return Maker;
}
public void setMaker(String maker) {
Maker = maker;
}
public Integer getPrice() {
return Price;
}
public void setPrice(Integer price) {
Price = price;
}
}

}