여러가지 구현을 해보면서 COCO dataset을 비롯해 다양한 오픈된 데이터셋의 annotation이 JSON data 형식인 것을 알게 되었습니다. 그래서 이번 포스팅에서는 JSON이란 무엇이며 어떻게 사용하는 것인지 알아보고자 합니다.
JSON이란?
JSON은 JavaScript Object Notation의 약자로 XML, YAML 과 함께 효율적으로 데이터를 저장하고 교환(exchange data)하는데 사용하는 텍스트 데이터 포맷 중의 하나입니다. JSON은 사람이 읽고 쓰기에 쉬우며, 또한 기계가 파싱하고 생성하기도에 쉽습니다.
JSON은 2가지의 구조로 이뤄져 있습니다.
- name/value pairs의 collection : object, record, dictionary, hash table, keyed list, associative array로 표현
- 정렬된 값들의 리스트 : array, vector, list, sequence로 표현
JSON의 구조
아래는 json data의 간단한 예시입니다. Python dictionary와 유사한 형식인 것을 알 수 있습니다.
{
"article": [
{
"id":"01",
"language": "JSON",
"edition": "first",
"author": "Derrick Mwiti"
},
{
"id":"02",
"language": "Python",
"edition": "second",
"author": "Derrick Mwiti"
}
],
"blog":[
{
"name": "Datacamp",
"URL":"datacamp.com"
}
]
}
중괄호({}, 객체, dict)로 시작합니다. Key-Value 구조를 가지고 있습니다. 파이썬의 dictionary와 같다고 보면 될것 같습니다. key는 큰 따옴표로 감싼 문자열만 사용하여야합니다. value에는 정수, 실수, 문자열, Null, 객체 등이 사용가능 합니다. 문자열 이스케이프를 사용할 수 있습니다.
\t: 탭 추가
\n: 개행
": 큰 따옴표 넣기
- 직렬화(serialization): JSON 데이터를 클래스, 맵, 리스트 등의 객체로 변환해주는 기능
- 역직렬화(deserialization): 직렬화의 반대 기능
1. Python에서 JSON 파일 생성하기
먼저 간단한 실습을 통해 Python에서 JSON 파일을 생성해 보겠습니다. JSON 파일을 위해 확장 라이브러리를 읽어오고, collections에서 OrderedDict 함수를 불러온 뒤 OrderedDict 타입의 file_data를 생성합니다.
import json
from collections import OrderedDict
file_data = OrderedDict()
이제 file_data 안에 name, language, words, number 데이터를 넣어줍니다.
file_data["name"] = "COMPUTER"
file_data["language"] = "kor"
file_data["words"] = {'ram':'램', 'process':'프로세스', 'processor':'프로세서', 'CPU':'씨피유'}
file_data["number"] = 4
출력 결과 JSON 형태의 데이터 파일이 출력됩니다.
print(json.dumps(file_data, ensure_ascii=False, indent="\t"))
with open('word.json', 'w', encoding="utf-8") as make_file:
json.dump(file_data, make_file, ensure_ascii=False, indent="\t")
이제 이를 파일로 만들어보겠습니다. json.dumps를 쓰지만 만들때는 json.dump를 씁니다. 또한, indent = "\t"를 쓰지 않는다면 한 줄로 출력이 됩니다. 아래를 Colab 화면 보시면 파일이 만들어진 것을 볼 수 있습니다.
2. Write Python object to JSON, Serialization, Encoding
from Python to JSON |
dict → object |
아래와 같은 Jame Kim이라는 정보를 담고 있는 사전형 자료(dictionary)를 json.dump()와 json.dumps()의 두 가지 방법으로 JSON 포맷 데이터로 만들어 보겠습니다.
student_data = {
"1.FirstName": "Gildong",
"2.LastName": "Hong",
"3.Age": 20,
"4.University": "Yonsei University",
"5.Courses": [
{
"Major": "Statistics",
"Classes": ["Probability",
"Generalized Linear Model",
"Categorical Data Analysis"]
},
{
"Minor": "ComputerScience",
"Classes": ["Data Structure",
"Programming",
"Algorithms"]
}
]
}
2-1. with open(): json.dump() 를 사용해서 JSON 포맷 데이터를 디스크에 쓰기
with open("student_file.json", "w") 로 "student_file.json" 이름의 파일을 쓰기("w") 모드로 열어놓고, json.dump(student_data, json_file) 로 직렬화해서 JSON으로 내보내고자 하는 객체 student_data를, 직렬화된 데이터가 쓰여질 파일 json_file 에 쓰기를 해줍니다.
import json
with open("student_file.json", "w") as json_file:
json.dump(student_data, json_file)
2-2. json.dumps()를 사용하여 JSON 포맷 데이터를 메모리에 만들기
만약 메모리 상에 JSON 포맷 데이터를 만들어놓고 python에서 계속 작업을 하려면 json.dumps() 를 사용합니다.
import json
st_json = json.dumps(student_data)
print(st_json)
{"5.Courses": [{"Classes": ["Probability", "Generalized Linear Model", "Categorical Data Analysis"], "Major": "Statistics"}, {"Minor": "ComputerScience", "Classes": ["Data Structure", "Programming", "Algorithms"]}], "3.Age": 20, "2.LastName": "Hong", "4.University": "Yonsei University", "1.FirstName": "Gildong"}
3. Read JSON to Python, Deserialization, Decoding
from JSON to Python |
dict → object |
3-1. 디스크에 있는 JSON 포맷 데이터를 json.load()를 사용해 Python 객체로 읽어오기 (역직렬화, 디코딩하기)
with open(): json.dump() 로 만들어놓은 JSON 포맷의 데이터 "student_file.json" 를 Python 으로 역질렬화(deserialization)해서 읽어와 보겠습니다. with open("student_file.json", "r") 로 읽기 모드("r")로 JSON파일을 열어 후에, json.load(st_json)으로 디코딩하였습니다.
import json
with open("student_file.json", "r") as st_json:
st_python = json.load(st_json)
st_python
{'1.FirstName': 'Jade',
'2.LastName': 'Kim',
'3.Age': 20,
'4.University': 'Korea University',
'5.Courses': [{'Classes': ['Probability',
'Generalized Linear Model',
'Categorical Data Analysis'],
'Major': 'Statistics'},
{'Classes': ['Data Structure', 'Programming', 'Algorithms'],
'Minor': 'ComputerScience'}]}
3-2. 메모리에 있는 JSON 포맷 데이터 json.loads()로 Python 객체 읽기 (역직렬화, 디코딩하기)
import json
st_python2 = json.loads(st_json3)
st_python2
{'1.FirstName': 'Jade',
'2.LastName': 'Kim',
'3.Age': 20,
'4.University': 'Korea University',
'5.Courses': [{'Classes': ['Probability',
'Generalized Linear Model',
'Categorical Data Analysis'],
'Major': 'Statistics'},
{'Classes': ['Data Structure', 'Programming', 'Algorithms'],
'Minor': 'ComputerScience'}]}
댓글