# 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. 파일첨부


+ Recent posts