지금까지 회사다니며 매일 화면만 만지작 거렸는데

드디어 타 회사와 연계할 API를 만들일이 생기게 되었다.

지난번 API 개발에서 사용할 AES/BASE64 에 대해서는 정리하였는데 

JSON에 대해서는 정리하지 않아 이번 기회에 정리한다.

 

 

1. JAVE에서 JSON 사용하기.

먼저 JAVA에서 JSON을 사용하려면 JSON관련 jar를 추가해야한다. 

아래의 링크에서 jar를 다운받자. 

※ json_simple-1.0.x 을 사용하면 ParseException 이 없는 것 같다. 왠만하면 1.1.x 이상 버전을 사용하자.

https://code.google.com/archive/p/json-simple/downloads

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

다운로드 후 Build Path를 지정해주자.

잘 적용이 되었다면 아래의 클래스들을 사용할 수 있다.

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

 

2. JSON 데이터 만들기

먼저 JSON을 만드는 연습부터 해보자.

만들고자 하는 데이터는 다음과 같다.

"rec_data" : {
	  "store_no" : "12345"
	, "store_nm" : "카페알리"
	, "search_dt" : "20220917"
	, "tran_cnt" : "4"
	, "tran_data" : 
	[
		{ 
		    "tran_dt" : "20220917"
		  , "tran_tm" : "135959"
		  , "tr_div" : "0"
		  , "tr_amt" : 3500
		  , "cust_nm" : "홍길동"
		}, 
		{ 
		    "tran_dt" : "20220917"
		  , "tran_tm" : "140101"
		  , "tr_div" : "0"
		  , "tr_amt" : 13500
		  , "cust_nm" : "고길동"
		}, 
		{ 
		    "tran_dt" : "20220917"
		  , "tran_tm" : "153131"
		  , "tr_div" : "0"
		  , "tr_amt" : 23500
		  , "cust_nm" : "김길동"
		}, 
		{ 
		    "tran_dt" : "20220917"
		  , "tran_tm" : "163123"
		  , "tr_div" : "0"
		  , "tr_amt" : 53500
		  , "cust_nm" : "오길동"
		}, 
	]
}

간단히 보면 { "data":"data" ... "array" : [ { ... }, { ... }, { ... }, { ... } ] } 형태이다.

 

JSON 데이터를 만들때는 최하위 -> 최상위 순서로 만든다.

즉, 예시의 데이터를 만드는 순서는 다음과 같다.

  • 가장 안쪽의 { ... } Object 생성
  • { ... } Object를  "tran_data" Array에 넣는다.
  • 최상위의 "rec_data" Object 에 들어가는 "data" : "data" 를 넣는다.
  • "rec_data"에 "tran_data" Array 를 넣는다.
package com.stream.study;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonMakeData {
	
	public JSONObject MakeJsonData() {
		
		// 최하위의 데이터를 생성한다.
		JSONObject jsonData1 = new JSONObject();
		JSONObject jsonData2 = new JSONObject();
		JSONObject jsonData3 = new JSONObject();
		JSONObject jsonData4 = new JSONObject();

		jsonData1.put("tran_dt", "20220917");
		jsonData1.put("tran_tm", "135959");
		jsonData1.put("tr_div", "0");
		jsonData1.put("tr_amt", 3500);
		jsonData1.put("cust_nm", "홍길동");
		
		jsonData2.put("tran_dt", "20220917");
		jsonData2.put("tran_tm", "140101");
		jsonData2.put("tr_div", "0");
		jsonData2.put("tr_amt", 13500);
		jsonData2.put("cust_nm", "고길동");
		
		jsonData3.put("tran_dt", "20220917");
		jsonData3.put("tran_tm", "153131");
		jsonData3.put("tr_div", "0");
		jsonData3.put("tr_amt", 23500);
		jsonData3.put("cust_nm", "김길동");
		
		jsonData4.put("tran_dt", "20220917");
		jsonData4.put("tran_tm", "162322");
		jsonData4.put("tr_div", "0");
		jsonData4.put("tr_amt", 53500);
		jsonData4.put("cust_nm", "박길동");
		
		// 최하위 데이터 출력
		System.out.println("jsonData1 :: " + jsonData1.toString());
		System.out.println("jsonData2 :: " + jsonData2.toString());
		System.out.println("jsonData3 :: " + jsonData3.toString());
		System.out.println("jsonData4 :: " + jsonData4.toString());


		// 최하위 데이터를 배열로 묶음
		JSONArray tran_data = new JSONArray();
		
		tran_data.add(jsonData1);
		tran_data.add(jsonData2);
		tran_data.add(jsonData3);
		tran_data.add(jsonData4);
		
		// 배열 출력
		System.out.println("tran_data :: " + tran_data.toString());
		
		// 최상위의 객체 생성 후 데이터 입력
		JSONObject rec_data = new JSONObject();
		
		rec_data.put("store_no", "12345");
		rec_data.put("store_nm", "카페알리");
		rec_data.put("search_dt", "20220917");
		rec_data.put("tran_cnt", String.valueOf(tran_data.size()));
		
		// 최상위 객체에 배열을 넣음
		rec_data.put("tran_data", tran_data);
	
		// 최종 확인
		System.out.println("rec_data :: " + rec_data.toString());
		
		return rec_data;
	}
}

/* 실행결과
jsonData1 :: {"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"}
jsonData2 :: {"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"}
jsonData3 :: {"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"}
jsonData4 :: {"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}
tran_data :: [{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]
rec_data :: {"store_nm":"카페알리","store_no":"12345","search_dt":"20220917","tran_cnt":"4","tran_data":[{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]}
{"store_nm":"카페알리","store_no":"12345","search_dt":"20220917","tran_cnt":"4","tran_data":[{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]}
*/

 

3. JSON 데이터 읽기

이번엔 생성한 데이터에 접근해서 읽어보자

이번엔 JSON데이터 생성과 반대로 최상위 -> 최하위로 접근한다.

package com.stream.study;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParsingData {


	// 생성한 JSON 데이터를 매개변수로 받는다.
	public void JsonDataParser_JSON(JSONObject jsonOrgData) {
		
	    System.out.println("======== PARSE JSON START ========");

        JSONObject jsonObject = jsonOrgData;
        
        // 받아 온 데이터 확인
        System.out.println("jsonObject :: " + jsonObject.toString());

        // 배열에 접근하기 위해 데이터를 JSONArray로 변환
        JSONArray tran_data = (JSONArray) jsonObject.get("tran_data");
        
        // 배열 확인
        System.out.println("tran_data :: " + tran_data.toString());

        // 배열을 순차적으로 탐색
        for(int i = 0; i < tran_data.size(); i++) {
        	
        	// 배열의 INDEX 별로 JsonObject 로 변환
        	JSONObject tran_data_arr = (JSONObject) tran_data.get(i);
        	
        	// JsonObject의 각 데이터를 파싱
        	String 	tran_dt 	= (String) 	tran_data_arr.get("tran_dt");
        	String 	tran_tm 	= (String) 	tran_data_arr.get("tran_tm");
        	String 	tr_div 		= (String) 	tran_data_arr.get("tr_div");
        	int 	tr_amt 		= (Integer) tran_data_arr.get("tr_amt");
        	String 	cust_nm 	= (String) 	tran_data_arr.get("cust_nm");
        	
        	// 데이터 출력
        	System.out.println("====== tran_data[" + i + "] ======");
        	System.out.println("tran_dt :: " + tran_dt);
        	System.out.println("tran_tm :: " + tran_tm);
        	System.out.println("tr_div 	:: " + tr_div);
        	System.out.println("tr_amt 	:: " + tr_amt);
        	System.out.println("cust_nm :: " + cust_nm);
        	
        	
        	System.out.println("======== PARSE JSON END ========");

    }
  }
}
    
/* 실행결과
======== PARSE JSON START ========
jsonObject :: {"store_nm":"카페알리","store_no":"12345","search_dt":"20220917","tran_cnt":"4","tran_data":[{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]}
tran_data :: [{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]
====== tran_data[0] ======
tran_dt :: 20220917
tran_tm :: 135959
tr_div 	:: 0
tr_amt 	:: 3500
cust_nm :: 홍길동
======== PARSE JSON END ========
====== tran_data[1] ======
tran_dt :: 20220917
tran_tm :: 140101
tr_div 	:: 0
tr_amt 	:: 13500
cust_nm :: 고길동
======== PARSE JSON END ========
====== tran_data[2] ======
tran_dt :: 20220917
tran_tm :: 153131
tr_div 	:: 0
tr_amt 	:: 23500
cust_nm :: 김길동
======== PARSE JSON END ========
*/

 

4. JSON 데이터를 문자열로 받은 후 파싱

생성된 데이터를 프로젝트 내부적으로 처리하는 것이 아니라면  JSON형태 그대로 주고 받는 경우는 없을 것이다.

대부분이 JSON데이터를 단순히 문자열 형태로 줄테니 문자열을 JSON으로 변환하여 사용하는 연습도 해보자.

package com.stream.study;

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JsonParsingData {


	// 생성한 JSON 데이터를 매개변수로 받는다.
	public void JsonDataParser_JSON(JSONObject jsonOrgData) {
		
		System.out.println("======== PARSE JSON START ========");

        JSONObject jsonObject = jsonOrgData;
        
        // 받아 온 데이터 확인
        System.out.println("jsonObject :: " + jsonObject.toString());

        // 배열에 접근하기 위해 데이터를 JSONArray로 변환
        JSONArray tran_data = (JSONArray) jsonObject.get("tran_data");
        
        // 배열 확인
        System.out.println("tran_data :: " + tran_data.toString());

        // 배열을 순차적으로 탐색
        for(int i = 0; i < tran_data.size(); i++) {
        	
        	// 배열의 INDEX 별로 JsonObject 로 변환
        	JSONObject tran_data_arr = (JSONObject) tran_data.get(i);
        	
        	// JsonObject의 각 데이터를 파싱
        	String 	tran_dt 	= (String) 	tran_data_arr.get("tran_dt");
        	String 	tran_tm 	= (String) 	tran_data_arr.get("tran_tm");
        	String 	tr_div 		= (String) 	tran_data_arr.get("tr_div");
        	int 	tr_amt 		= (Integer) tran_data_arr.get("tr_amt");
        	String 	cust_nm 	= (String) 	tran_data_arr.get("cust_nm");
        	
        	// 데이터 출력
        	System.out.println("====== tran_data[" + i + "] ======");
        	System.out.println("tran_dt :: " + tran_dt);
        	System.out.println("tran_tm :: " + tran_tm);
        	System.out.println("tr_div 	:: " + tr_div);
        	System.out.println("tr_amt 	:: " + tr_amt);
        	System.out.println("cust_nm :: " + cust_nm);
        	
        	
        	System.out.println("======== PARSE JSON END ========");

        }
	}
	
	// JSON 데이터 문자열을 매개변수로 받는다
	public void JsonDataParser_String(String jsonOrgData_String) {

		System.out.println("======== PARSE STRING START ========");
		
		// String 출력
		System.out.println(jsonOrgData_String);
		
		// 문자열 -> JSONObject로 변환하기 위해 JSONParser를 생성
		JSONParser jsonParser = new JSONParser();
		
		// Parse를 하면 try-catch 감싸주어야 함.
		try {
			
			// parse()의 반환형이 Object 이므로 JSONObject형으로 변환
			JSONObject rec_data = (JSONObject) jsonParser.parse(jsonOrgData_String);
			
			// rec_data의 배열에 접근하기 위해 tran_data를 JSONArray로 변환
			JSONArray tran_data = (JSONArray) rec_data.get("tran_data");
	        
	        System.out.println("tran_data :: " + tran_data.toString());

	        for(int i = 0; i < tran_data.size(); i++) {
	        	//System.out.println("tran_data[" + i + "] :: " + tran_data.get(i).toString());
	        	
	        	JSONObject tran_data_arr = (JSONObject) tran_data.get(i);
	        	
	        	String 	tran_dt 	= (String) 	tran_data_arr.get("tran_dt");
	        	String 	tran_tm 	= (String) 	tran_data_arr.get("tran_tm");
	        	String 	tr_div	 	= (String) 	tran_data_arr.get("tr_div");
	        	
	        	// JSON에서 숫자의 기본 타입은 Long으로 지정되므로 Integer를 쓰면 에러
	        	Long 	tr_amt 		= (Long)	tran_data_arr.get("tr_amt");
	        	String 	cust_nm 	= (String) 	tran_data_arr.get("cust_nm");
	        	
	        	System.out.println("====== tran_data[" + i + "] ======");
	        	System.out.println("tran_dt :: " + tran_dt);
	        	System.out.println("tran_tm :: " + tran_tm);
	        	System.out.println("tr_div 	:: " + tr_div);
	        	System.out.println("tr_amt 	:: " + tr_amt);
	        	System.out.println("cust_nm :: " + cust_nm);

	        }
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("======== PARSE STRING END ========");
		
	}
}

/* 실행결과
======== PARSE STRING START ========
{"store_nm":"카페알리","store_no":"12345","search_dt":"20220917","tran_cnt":"4","tran_data":[{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]}
tran_data :: [{"tran_dt":"20220917","cust_nm":"홍길동","tr_amt":3500,"tr_div":"0","tran_tm":"135959"},{"tran_dt":"20220917","cust_nm":"고길동","tr_amt":13500,"tr_div":"0","tran_tm":"140101"},{"tran_dt":"20220917","cust_nm":"김길동","tr_amt":23500,"tr_div":"0","tran_tm":"153131"},{"tran_dt":"20220917","cust_nm":"박길동","tr_amt":53500,"tr_div":"0","tran_tm":"162322"}]
====== tran_data[0] ======
tran_dt :: 20220917
tran_tm :: 135959
tr_div 	:: 0
tr_amt 	:: 3500
cust_nm :: 홍길동
====== tran_data[1] ======
tran_dt :: 20220917
tran_tm :: 140101
tr_div 	:: 0
tr_amt 	:: 13500
cust_nm :: 고길동
====== tran_data[2] ======
tran_dt :: 20220917
tran_tm :: 153131
tr_div 	:: 0
tr_amt 	:: 23500
cust_nm :: 김길동
====== tran_data[3] ======
tran_dt :: 20220917
tran_tm :: 162322
tr_div 	:: 0
tr_amt 	:: 53500
cust_nm :: 박길동
======== PARSE STRING END ========
*/

 

※ 위의 코드를 실행하기 위한 main() 

package com.stream.study;
import org.json.simple.JSONObject;
	
public class JsonParsingTest {
	
	public static void main(String[] args) {
		
		JsonMakeData 	jsonMakeData 	= new JsonMakeData();
		JsonParsingData jsonParsingData = new JsonParsingData();
		
		
		JSONObject jsonData = new JSONObject();
		
		jsonData = jsonMakeData.MakeJsonData();
		
		System.out.println(jsonData.toString());
		
		jsonParsingData.JsonDataParser_JSON(jsonData);
		jsonParsingData.JsonDataParser_String(jsonData.toString());
		
	}
}

'JAVA' 카테고리의 다른 글

Static { } (Static 블록화)  (0) 2022.11.03
HttpURLConnection으로 POST / GET 연습  (0) 2022.10.11
AES 암호화 & BASE64 인코딩  (0) 2022.09.04
BufferedInputStream  (0) 2022.08.28
BigDecimal  (0) 2022.08.28

+ Recent posts