Scene graph 연구를 진행하면서 json 파일을 다룰 일이 많을 것 같아서, 유용한 함수와 설명을 간략하게 기록해둔다.
목차
.json 파일에서 json이란, JavaScript Object Notation의 약자로, 데이터를 문자열 형태로 나타내기 위해 사용한다.
원래 자바스크립트에서 파생되었으나, 프로그래밍 언어에 상관 없이 표준으로 사용되어 시스템의 데이터를 나타내고, 송신 및 수신할 때 많이 사용된다.
json 파일의 구조
json은 단순히 데이터의 포맷, 즉 데이터를 나타내는 방법을 말한다. 따라서 이를 데이터로 활용하기 위해서는 json 파일이 갖고 있는 데이터를 받아 (python이라면) python의 객체 혹은 변수에 할당받아 사용한다.
그 구조는 단순히 두 가지만 알면 된다.
- Object (객체)
- Name/Value의 순서쌍으로, '{}'로 정의하며, 파이썬의 딕셔너리(dictionary) 구조와 같다.
- 예시 : { "이름" : "JJuk_E", "나이" : "20", "성별" : "남" }
- Array (배열)
- 흔히 많은 프로그래밍에서 사용하는 배열이다. 파이썬의 리스트 구조와 같다.
- 예시 : [ 1, 2, 3 ]
매우 단순하지만, 표현 방법에 따라 복잡하게 보일 수 있다. 다음 예시를 보자.
{"url": "https://temp.jpg", "objects": [{"name": "person"}, {"name": "shirt"}], "attributes": [{"attribute": "tall", "object": 0}, {"attribute": "old", "object": 0}, {"attribute": "white", "object": 1}], "relationships": [{"predicate": "wearing", "subject": 0, "object": 1}]}
이렇게 단순히 나열되어 있으면 보기 매우 복잡하다.
Visual Studio Code를 사용하는 경우, '우클릭 - Format Document'를 클릭하여 다음과 같이 정렬해줄 수 있다.
훨씬 보기 깔끔해졌다!
대충 구조를 살펴보니 데이터는 "url" : ..., "objects" : ..., "attributes" : ..., "relationships" : ... 라는 4개의 하위 객체가 존재하고, objects와 attributes, relationsihps라는 name의 value로는 또다른 하위 객체가 배열 형태로 들어가있는 구조를 갖는다.
이제 파이썬에서 json 데이터를 어떻게 다루는지 자세히 알아보자.
Python 객체와의 상호 변환
먼저, 파이썬 객체와 그에 해당하는 json의 datatype을 알아보자.
Python | Json |
None | null |
dict | Object |
list | Array |
tuple | Array |
int | Number |
float | Number |
str | String |
True | true |
False | false |
파이썬에서는 json 데이터를 처리하기 위해 다음 모듈을 사용한다.
import json
json.load() & json.loads()
json.load(), json.loads() 함수는 json 포맷의 데이터를 python 객체로 읽어오는 것으로, 역직렬화(deserialization), 디코딩(decoding)이라고 한다.
.json 파일을 읽어올 수도 있고(load), 메모리에 존재하는 json 포맷의 데이터를 읽어올 수도(loads) 있다.
먼저 json 파일을 읽어오는 방법은 다음과 같다.
with open("json_file.json", "r") as jr:
py_obj = json.load(jr)
json.loads()를 파일을 읽어올 때 사용하면 TypeError가 발생한다.
메모리에 있는 json 데이터를 읽어오는 방법은 다음과 같다.
import json
py_obj2 = json.loads(json_str)
loads의 s를 빼면 AttributeError가 발생한다.
json.dump() & json.dumps()
json.dump(), json.dumps()함수는 반대로 python 객체를 json 파일 혹은 문자열로 변환해주는 함수로, 직렬화(serialization), 인코딩(encoding)이라 한다.
먼저 파일로 저장하는 dump()함수는 다음과 같이 사용한다.
import json
with open("json_file.json", "w") as f:
json.dump(json_obj, f, indent=4)
여기서 indent는 파일을 생성할 때 들여쓰기를 통해 알아보기 쉽게 출력되도록 해준다.
메모리에 존재하는 json object를 (출력 등을 위해) python 객체로 바꿔주는 방법은 다음과 같다.
import json
json_str = json.dumps(json_obj)
print(json_str)
# 예쁘게 출력하는 방법
json_str = json.dumps(json_obj, indent=4)
print(json_str)
파이썬 dictionary 다루기
json 파일은 dictionary 자료형 그 자체라고 봐도 무방하다. 따라서 dictionary를 다루는 방법을 알아두어야 하는데, 그내용은 다음 글을 참조하자.
최근댓글