지금까지 회사다니며 매일 화면만 만지작 거렸는데
드디어 타 회사와 연계할 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 |