JSON 과 python JSON encoder decoder 예제

1. What is JSON? 


JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다. 이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다.

https://www.json.org/json-ko.html

언어에 독립적인 포멧이라 인터넷에서 자료를 주고받을 때 그 자료를 표현하는 방법으로 알려져 있다고 한다.

https://ko.wikipedia.org/wiki/JSON


JSON의 형식은 요약하면 다음과 같다.

object  -> { "name" : value , ... }
array -> [ value or array or object , ... ]
value -> number, string, true, false, null, object, array


JSON은 알게 모르게 많이 사용되고 있다. 
예를 들어 StarCraft의 설정파일도 JSON으로 되어 있고,

{
    "General settings": {
        "Starcraft-Active Hotkey Profile": "$device",
        "Starcraft-Custom Type": "Melee"
    },
    "selectedSkins": "",
    "selectedConsole": "",
    "ShowTurnRate": false,
    "MatureLanguageFilter": true,
    "GameTimer": false,
    "apm_Showing": false,
    "apm_AlertUseColor": false,
    "ColorCycle": true,
...

matplotlib의 fontlist같은 것들도 json 파일로 되어있다.

{
  "_version": 310,
  "_FontManager__default_weight": "normal",
  "default_size": null,
  "defaultFamily": {
    "ttf": "DejaVu Sans",
    "afm": "Helvetica"
  },
  "ttflist": [
    {
      "fname": "fonts\\ttf\\DejaVuSerif-Bold.ttf",
      "name": "DejaVu Serif",
      "style": "normal",
      "variant": "normal",
      "weight": "bold",
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },
...

또한, wikipedia의 db도 json 형식의 파일로 다운받을 수 있다.

https://www.wikidata.org/wiki/Wikidata:Database_download/ko



2. Python JSON


python에서는 JSON encoder, decoder 라이브러리를 제공하고 있다.

ttps://docs.python.org/3.7/library/json.html


JSON의 데이터 형식과 Python 데이터 형식은 아래와 같이 변환된다.

JSON data type  <->   python data type
object  <->   dict
array  <->   list
string  <->   str
number(int)  <->   int
number(real)  <->   float
true  <->   True
false  <->   False
null  <->   None



2.1. JSON decoder example code

import json
def dec_json(filepath):
    try:
        with open(filepath,'r') as fin:
            
            try:
                datas = json.loads(fin.read())
            except json.JSONDecodeError:
                try:
                    fin.seek(0)
                    datas = [json.loads(l) for l in fin]
                except json.JSONDecodeError:
                    print("JSONDecodeError :",filepath)
                    return None
    
    except FileNotFoundError:
        print("FileNotFoundError :",filepath)
        return None
    
    return datas


json.loads를 사용하면 간단히 json파일의 내용을 디코딩할 수 있다.

위 코드를 사용해 matplotlib의 fontlist-v310.json을 디코딩 하면 아래와 같은 결과가 나온다.



2.2. JSON encoder example code

예제는 블로그 sitemap.xml 파일에서 url과 마지막 업데이트 시간을 읽어와 JSON 형식의 파일을 만드는 작업을 수행한다.

JSON 파일로의 인코딩은 json.dump를 사용 하였다.


import json
import urllib.request
import urllib.error
from html.parser import HTMLParser

class MyXMLParser(HTMLParser):
    _curent_tag = None
    _data_buffer = None
    _url = {}
    _list = []
    
    def handle_starttag(self, tag, attrs):
        if tag in ('loc', 'lastmod'):
            self._curent_tag = tag
            self._data_buffer = []

    def handle_endtag(self, tag):
        if tag == self._curent_tag:
            self._url[tag] = ' '.join(self._data_buffer)
        
        self._curent_tag = None
        self._data_buffer = []
        
        if tag in ('url'):
            self._list.append(self._url)
            self._url = {}

    def handle_data(self, data):
        if self._curent_tag is not None:
            self._data_buffer.append(data)
    
        
def enc_json(url, json_path):
        
    opener = urllib.request.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    parser = MyXMLParser()

    with opener.open(url) as f:        
        parser.feed(f.read().decode())
        print(parser._list)
    
    with open(json_path,'w') as fout:
        json.dump(parser._list,fout)


인코더 예제를 사용하여 블로그의 url과 업데이트 시간들을 받아와 JSON파일을 만들면 아래와 같이 만들어 진다.


이 파일을 다시 디코딩하면 다음과 같은 결과를 볼 수 있다.




댓글

이 블로그의 인기 게시물

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

python ctypes LoadLibrary로 windows dll 로드 및 함수 호출 예제