2022-11-08 20:01:54

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