데이터를 주고 받을 때 많이 사용되는 JSON 정리
JSON, 제이슨 많이 들어보셨죠?
데이터를 주고 받을 때 많이 사용되는 파일 형식 중 하나가 JSON입니다. JavaScript Object Notation의 약자입니다. JSON 이외에 파일을 주고 받을 때 많이 사용되는 형식에는 XML(eXtensible Markup Language)이 있는데, 최근에는 XML보다는 JSON을 더 많이 사용하는 추세인 것 같습니다. 제 개인적인 경험에서는 통신할 때 XML에서 데이터를 파싱하는 것보다 JSON에서 데이터를 추출하는 것이 훨씬 더 용이했습니다.
JSON 문법 정리
JSON 공식 홈페이지[1]에 따르면, JSON은 두 가지 중요한 구조를 갖는다고 합니다.
1. 이름(키)-값 쌍의 모음
다양한 프로그래밍 언어에서 object, record, struct, dictionary, has table, keyed list, associative array 등으로 이해되는 형태라고 보시면 됩니다. 파이썬에 익숙하신 분들은 dictionary를 생각하시면 되고, 자바스크립트에 익숙하신 분들은 object를 생각하시면 됩니다.
{"name" : "홍길동", "age" : 47}
2. 값들의 순서 있는 리스트
다양한 프로그래밍 언어에서, array, vector, list, sequence 등으로 이해되는 형태라고 생각하시면 됩니다. 파이썬에 익숙하신 분들은 list를, 자바스크립트에 익숙하신 분들은 array를 생각하시면 됩니다.
{
"Nation": ["대한민국", "중국", "일본", "미국"]
}
{
"종목":[
{"종목명":삼성전자, "종목코드":"005930"},
{"종목명":네이버, "종목코드":"035420"},
{"종목명":네이버, "종목코드":"035720"}
]
}
실제 사용되는 JSON 데이터 확인하기
한국투자증권에서 제공하는 API 서버에서 데이터를 전송할 때도 JSON 형식을 사용합니다.
주식 현금 주문을 위한 요청과 응답에 관한 JSON 데이터는 다음과 같습니다.
Request(요청)
{
"CANO": "810XXXXX",
"ACNT_PRDT_CD": "01",
"PDNO": "009150",
"ORD_DVSN": "00",
"ORD_QTY": "3",
"ORD_UNPR": "150000"
}
이름-값 쌍들이 중괄호 안에 들어가 있는 것을 보실 수 있습니다.
Response(응답)
{
"rt_cd": "0",
"msg_cd": "APBK0013",
"msg1": "주문 전송 완료 되었습니다.",
"output": {
"KRX_FWDG_ORD_ORGNO": "06010",
"ODNO": "0001569157",
"ORD_TMD": "155211"
}
}
마찬가지로 이름-값 쌍들이 중괄호 안에 들어가 있습니다. 그 중 output 이름에 대한 값은 또다른 중괄호로 감싸진 이름-값들의 모음인 것을 알 수 있습니다.
하나만 더 확인해볼까요? 주식 잔고 조회와 관련된 요청과 응답에 관한 JSON입니다.
Request(요청)
{
"CANO": "810XXXXX",
"ACNT_PRDT_CD": "01",
"AFHR_FLPR_YN": "N",
"OFL_YN": "N",
"INQR_DVSN": "01",
"UNPR_DVSN": "01",
"FUND_STTL_ICLD_YN": "N",
"FNCG_AMT_AUTO_RDPT_YN": "N",
"PRCS_DVSN": "01",
"CTX_AREA_FK100": "",
"CTX_AREA_NK100": ""
}
Response(응답)
{
"ctx_area_fk100": "81055689^01^N^N^01^01^N^ ",
"ctx_area_nk100": " ",
"output1": [
{
"pdno": "009150",
"prdt_name": "삼성전기",
"trad_dvsn_name": "현금",
"bfdy_buy_qty": "12",
"bfdy_sll_qty": "0",
"thdt_buyqty": "1686",
"thdt_sll_qty": "41",
"hldg_qty": "1657",
"ord_psbl_qty": "1611",
"pchs_avg_pric": "135440.2517",
"pchs_amt": "224424497",
"prpr": "0",
"evlu_amt": "0",
"evlu_pfls_amt": "0",
"evlu_pfls_rt": "0.00",
"evlu_erng_rt": "0.00000000",
"loan_dt": "",
"loan_amt": "0",
"stln_slng_chgs": "0",
"expd_dt": "",
"fltt_rt": "-100.00000000",
"bfdy_cprs_icdc": "-184500",
"item_mgna_rt_name": "",
"grta_rt_name": "",
"sbst_pric": "140220",
"stck_loan_unpr": "0.0000"
},
{
"pdno": "009150",
"prdt_name": "삼성전기",
"trad_dvsn_name": "자기융자",
"bfdy_buy_qty": "3",
"bfdy_sll_qty": "0",
"thdt_buyqty": "0",
"thdt_sll_qty": "0",
"hldg_qty": "3",
"ord_psbl_qty": "3",
"pchs_avg_pric": "123000.0000",
"pchs_amt": "369000",
"prpr": "0",
"evlu_amt": "0",
"evlu_pfls_amt": "0",
"evlu_pfls_rt": "0.00",
"evlu_erng_rt": "0.00000000",
"loan_dt": "20211223",
"loan_amt": "369000",
"stln_slng_chgs": "0",
"expd_dt": "",
"fltt_rt": "-100.00000000",
"bfdy_cprs_icdc": "-184500",
"item_mgna_rt_name": "",
"grta_rt_name": "",
"sbst_pric": "140220",
"stck_loan_unpr": "123000.0000"
}
],
"output2": [
{
"dnca_tot_amt": "346455",
"nxdy_excc_amt": "346455",
"prvs_rcdl_excc_amt": "346455",
"cma_evlu_amt": "0",
"bfdy_buy_amt": "0",
"thdt_buy_amt": "0",
"nxdy_auto_rdpt_amt": "0",
"bfdy_sll_amt": "0",
"thdt_sll_amt": "0",
"d2_auto_rdpt_amt": "0",
"bfdy_tlex_amt": "0",
"thdt_tlex_amt": "0",
"tot_loan_amt": "0",
"scts_evlu_amt": "1759600",
"tot_evlu_amt": "2106055",
"nass_amt": "2106055",
"fncg_gld_auto_rdpt_yn": "",
"pchs_amt_smtl_amt": "2516522",
"evlu_amt_smtl_amt": "1759600",
"evlu_pfls_smtl_amt": "-756922",
"tot_stln_slng_chgs": "0",
"bfdy_tot_asst_evlu_amt": "2142945",
"asst_icdc_amt": "-36890",
"asst_icdc_erng_rt": "0.00000000"
}
],
"rt_cd": "0",
"msg_cd": "KIOK0510",
"msg1": "조회가 완료되었습니다 "
}
복잡해보여도 결국 이름-값 쌍의 모음이고, 대괄호[ ]로 감싸여 있는 리스트들일 뿐입니다.
참고자료
[1] json 공식 홈페이지, https://www.json.org/json-en.html
[2] 한국투자증권 API 문서, https://apiportal.koreainvestment.com/apiservice/oauth2#L_214b9e22-8f2e-4fba-9688-587279f1061a