# JSON (JavaScript Object Notation)
'XML' 보다 좀 더 간략화 된 데이터의 구성이다. 웹 서버와 클라이언트 사이에서 데이터를 주고 받을 때 사용한다.
자바스크립트 구문 형식을 따르지만 프로그래밍 언어나플랫폼에 독립적이므로 자유롭게 사용 할 수 있다.
데이터 형식이 복잡하지 않아도 되는 곳에서는 'JSON'이 'XML'보다 많이 사용된다.
형식은 문자열, 숫자, 논리형(Boolean), 배열, 객체 등을 표현 할 수 있다.
1. 단순 값 : 문자열, 숫자, 논리형(Boolean) - JSONObject
ex) { "이름": "홍길동", "나이" : 25, "결혼" : true }
2. 배열 : "대괄호[]" 안에 값을 콤마로 나열 - JSONObject 안에 JSONArray
ex) { "취미": ["축구", "농구", "독서", "기타"] }
3. 객체 : "중괄호{}" 안에 키:값 형태로 나열 - JSONObject 안에 JSONObject
ex) { "가족": {"아버지": "홍거지", "어머니": "김태희"} }
예제) "지식경제부 기술표준 앱 공모전 일부 API 이용"
1. 요청 URL
http://api.ibtk.kr/openapi/examCertiInfo_api.do?institutetype=01
2. activity_main.xml
3. AndroidManifest.xml
4. MainActivity.java
package com.tistory.gangzzang.json_test; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.example.publicappapi_json.R; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { TextView textView; // 출력할 textView @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.textview); // 텍스트뷰 객체 참조 new JsonLoadingTask().execute(); } // onCreate /** * 원격의 데이터를 가지고 JSON 객체를 생성한 다음에 객체에서 데이터 타입별로 데이터를 읽어서 StringBuffer에 추가한다. */ public String getJsonText() { // 내부적으로 문자열 편집이 가능한 StringBuffer 생성자 StringBuffer sb = new StringBuffer(); try { String line = getStringFromUrl("http://api.ibtk.kr/openapi/examCertiInfo_api.do?institutetype=01"); /* 넘어오는 데이터 구조 { [ { } ] } JSON 객체 안에 배열안에 내부JSON 객체*/ /* URL 요청시 넘어오는 JSON 데이터 값 */ { "result_code": 200, "total_count": 183, "kkt_list": [ { "continentname": "아시아", "nationname": "한국", "instituteid": "3431", "institutename": "(유)대영티엠아이", "institutetype": "01", "continentcode": "EA0001", "nationcode": "KOR", "address": "[565-901] 전북 완주군 봉동읍 구미리 837-3번지", "phone": "063-214-9011", "fax": "063-214-0236", "description": "회사구분: 교정기관\r주요제품: 만능재료시험기\r현황: 교정실..현장", "linkageinstituteid": "KOLAS", "linkagepage": "http://www.kolas.go.kr/WebApp/Main/Search/Search0010.aspx?CompanyNo=3431&AccreditNo=3899" }, { "continentname": "아시아", "nationname": "한국", "instituteid": "3231", "institutename": "한국건설생활환경시험연구원(시험)", "institutetype": "01", "continentcode": "EA0001", "nationcode": "KOR", "address": "[153-803] 서울 금천구 가산동 459-28", "phone": "02-2102-2500", "fax": "02-838-7891", "description": "회사구분: 법인\r주요제품: 안전인증 및 자율안전, 계측교정, 시험분석, 품질보증, 인증심사업무\r\n\r현황: 만능재료시험기 등 408종 908점", "linkageinstituteid": "KOLAS", "linkagepage": "http://www.kolas.go.kr/WebApp/Main/Search/Search0010.aspx?CompanyNo=3231&AccreditNo=3051" }, ... 생략 ] } // 원격에서 읽어온 데이터로 JSON 객체 생성 JSONObject object = new JSONObject(line); // "kkt_list" 배열로 구성 되어있으므로 JSON 배열생성 JSONArray Array = new JSONArray(object.getString("kkt_list")); for (int i = 0; i < Array.length(); i++) { // bodylist 배열안에 내부 JSON 이므로 JSON 내부 객체 생성 JSONObject insideObject = Array.getJSONObject(i); // StringBuffer 메소드 ( append : StringBuffer 인스턴스에 뒤에 덧붙인다. ) // JSONObject 메소드 ( get.String(), getInt(), getBoolean() .. 등 : 객체로부터 데이터의 타입에 따라 원하는 데이터를 읽는다. ) sb.append("대륙 : ").append(insideObject.getString("continentname")).append("\n"); sb.append("국가 : ").append(insideObject.getString("nationname")).append("\n"); sb.append("기관아이디 : ").append(insideObject.getString("instituteid")).append("\n"); sb.append("기관명 : ").append(insideObject.getString("institutename")).append("\n"); sb.append("기관구분 : ").append(insideObject.getString("institutetype")).append("\n"); sb.append("대륙코드 : ").append(insideObject.getString("continentcode")).append("\n"); sb.append("국가코드 : ").append(insideObject.getString("nationcode")).append("\n"); sb.append("주소 : ").append(insideObject.getString("address")).append("\n"); sb.append("연락처 : ").append(insideObject.getString("phone")).append("\n"); sb.append("설명 : ").append(insideObject.getString("description")).append("\n"); sb.append("소속기구 : ").append(insideObject.getString("linkageinstituteid")).append("\n"); sb.append("기관홈페이지 : ").append(insideObject.getString("linkagepage")).append("\n"); sb.append("\n"); sb.append("\n"); } // for } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } // getJsonText // getStringFromUrl : 주어진 URL 페이지를 문자열로 얻는다. public String getStringFromUrl(String url) throws UnsupportedEncodingException { // 입력스트림을 "UTF-8" 를 사용해서 읽은 후, 라인 단위로 데이터를 읽을 수 있는 BufferedReader 를 생성한다. BufferedReader br = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url), "UTF-8")); // 읽은 데이터를 저장한 StringBuffer 를 생성한다. StringBuffer sb = new StringBuffer(); try { // 라인 단위로 읽은 데이터를 임시 저장한 문자열 변수 line String line = null; // 라인 단위로 데이터를 읽어서 StringBuffer 에 저장한다. while ((line = br.readLine()) != null) { sb.append(line); } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } // getStringFromUrl // getInputStreamFromUrl : 주어진 URL 에 대한 입력 스트림(InputStream)을 얻는다. public static InputStream getInputStreamFromUrl(String url) { InputStream contentStream = null; try { // HttpClient 를 사용해서 주어진 URL에 대한 입력 스트림을 얻는다. HttpClient httpclient = new DefaultHttpClient(); HttpResponse response = httpclient.execute(new HttpGet(url)); contentStream = response.getEntity().getContent(); } catch (Exception e) { e.printStackTrace(); } return contentStream; } // getInputStreamFromUrl // AsyncTask 를 이용 UI 처리 및 Background 작업 등을 하나의 클래스에서 작업 할 수 있도록 지원해준다. private class JsonLoadingTask extends AsyncTask{ @Override protected String doInBackground(String... strs) { return getJsonText(); } // doInBackground : 백그라운드 작업을 진행한다. @Override protected void onPostExecute(String result) { textView.setText(result); } // onPostExecute : 백그라운드 작업이 끝난 후 UI 작업을 진행한다. } // JsonLoadingTask } // end
5. 실행화면
5. 파일첨부
'Android' 카테고리의 다른 글
지식경제부 기술표준원 "기술표준 앱 공모전" 최우수상 (2) | 2013.03.29 |
---|---|
안드로이드 주요 용어 및 구조 (0) | 2013.01.28 |
안드로이드 개발 환경 구축2 (0) | 2013.01.16 |
안드로이드 개발 환경 구축 (0) | 2013.01.15 |