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으로 되어 있고,
matplotlib의 fontlist같은 것들도 json 파일로 되어있다.
또한, 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파일을 만들면 아래와 같이 만들어 진다.
이 파일을 다시 디코딩하면 다음과 같은 결과를 볼 수 있다.
댓글
댓글 쓰기