[Python] JSON 파일 다루기 - AI HUB 라벨 데이터 활용하는 방법
파이썬에서 JSON을 다루는 방법
JSON(JavaScript Object Notation)은 현대 데이터 교환의 표준 형식으로서, 경량의 구조화된 데이터 전송 방식을 제공한다. JSON은 그 표현이 간결하고, 사람이 읽기 쉬운 동시에 기계가 쉽게 파싱할 수 있어 웹 애플리케이션, 모바일 애플리케이션, 그리고 다양한 네트워크 통신 환경에서 광범위하게 활용된다. 파이썬은 JSON을 다루기 위한 강력한 내장 모듈을 제공하여, 사용자가 JSON을 쉽게 파싱하고 직렬화할 수 있도록 한다.
JSON 파일의 구조
JSON은 기본적으로 키-값 쌍으로 이루어져 있으며, 다양한 데이터 타입을 지원한다. 이는 객체(object), 배열(array), 문자열(string), 숫자(number), 불리언(boolean), 그리고 null 등의 자료형으로 데이터를 표현할 수 있다. JSON의 구조는 JavaScript 객체와 매우 유사하여 직관적인 이해를 가능하게 한다. 다음은 JSON의 예시이다:
{
"name": "홍길동",
"age": 30,
"isStudent": false,
"skills": ["Python", "Java", "C++"],
"address": {
"city": "서울",
"zipcode": "12345"
}
}
이 예시에서 name
, age
, isStudent
, skills
, address
는 모두 키이며, 각각 특정한 데이터 값과 연관되어 있다. skills
는 배열로 구성되어 있으며, address
는 또 다른 객체로 표현된다. 이러한 구조는 JSON의 유연성과 계층적 데이터 표현을 잘 보여준다.
더욱 복잡한 JSON 파일의 예시로는 다음과 같은 데이터 구조를 사용할 수 있다. 이 예시는 AI 허브에서 제공하는 한국형 비전 데이터셋의 일부이다.
출처: AI 허브 객체 간 관계성 인지용 한국형 비전 데이터
{
"info": {
"description": "이미지 설명문 추출 및 생성용 한국형 비전 데이터셋",
"version": "1.0",
"date_year": "2022"
},
"categories": [
{
"supercategory": "outdoor",
"id": "12",
"name": "trash bin"
}
],
"images": {
"id": "0007265",
"height": 1920,
"width": 1081,
"file_name": "IMG_0007265_trash_bin(trash_bin).jpg"
},
"annotations": [
{
"text": [
{
"english": "trash bin is on the right side of car.",
"korean": "휴지통은 자동차보다 오른쪽에 위치해 있습니다.",
"entity1": "휴지통",
"entity2": "자동차",
"verb": "있습니다.",
"relation": "onright"
}
],
"matrix": [
{
"sorce": "휴지통",
"target": "자동차",
"m_relation": "onright"
}
]
}
]
}
이 JSON 데이터는 info
, categories
, images
, annotations
라는 상위 키로 구성되어 있으며 각각 고유한 구조와 데이터 타입을 가진다. 이를 통해 복잡한 계층 구조를 가진 데이터를 효율적으로 표현할 수 있다. 각 항목의 주요 파라미터를 다음과 같이 설명할 수 있다:
info
: 데이터셋에 대한 메타 정보를 포함하며,description
,version
,date_year
등의 정보를 제공한다.categories
: 이미지에 포함된 객체의 상위 범주를 정의하며, 각 객체는supercategory
,id
,name
속성을 가진다. 이는 이미지에서 다양한 카테고리를 정의하고 관리하는 데 유용하다.images
: 이미지 파일에 대한 메타 정보를 제공하며,id
,height
,width
,file_name
을 포함한다. 이를 통해 이미지 파일의 크기와 식별자를 관리할 수 있다.annotations
: 이미지에 대한 설명과 관계 정보를 포함하며,text
와matrix
로 구성된다.text
는 언어별로 설명을 제공하며,matrix
는 객체 간의 관계를 명시한다. 이를 통해 이미지의 객체 간 관계를 구조화하여 표현할 수 있다.
파이썬에서 JSON 파일 파싱하기
파이썬의 json
모듈은 JSON 데이터를 손쉽게 파싱하고 생성하는 기능을 제공한다. 이를 통해 JSON 형식의 문자열을 파이썬의 딕셔너리로 변환하거나, 반대로 파이썬 딕셔너리를 JSON으로 직렬화하는 작업이 가능하다.
1. JSON 파일 읽기
이제 앞서 소개한 복잡한 JSON 파일을 파싱하는 예시를 살펴보자. 다음은 해당 JSON 파일을 파이썬 객체로 변환하는 방법이다:
import json
with open('complex_data.json', 'r', encoding='utf-8') as file:
data = json.load(file)
print(data)
위 코드에서 json.load()
함수는 파일 객체를 받아 파이썬의 딕셔너리로 변환해준다. 이 예제에서 complex_data.json
은 복잡한 구조의 JSON 파일을 의미하며, 파싱 결과는 다음과 같이 딕셔너리 형태로 출력된다:
{
'info': {
'description': '이미지 설명문 추출 및 생성용 한국형 비전 데이터셋',
'version': '1.0',
'date_year': '2022'
},
'categories': [
{
'supercategory': 'outdoor',
'id': '12',
'name': 'trash bin'
}
],
'images': {
'id': '0007265',
'height': 1920,
'width': 1081,
'file_name': 'IMG_0007265_trash_bin(trash_bin).jpg'
},
'annotations': [
{
'text': [
{
'english': 'trash bin is on the right side of car.',
'korean': '휴지통은 자동차보다 오른쪽에 위치해 있습니다.',
'entity1': '휴지통',
'entity2': '자동차',
'verb': '있습니다.',
'relation': 'onright'
}
],
'matrix': [
{
'sorce': '휴지통',
'target': '자동차',
'm_relation': 'onright'
}
]
}
]
}
이로써 JSON 파일의 복잡한 구조도 파이썬 객체로 손쉽게 변환할 수 있으며, 변환된 딕셔너리를 사용하여 데이터에 접근하거나 특정 항목을 수정할 수 있다. 예를 들어 info
섹션의 description
에 접근하려면 다음과 같은 방식으로 접근하면 된다:
description = data['info']['description']
print(description) # 출력: 이미지 설명문 추출 및 생성용 한국형 비전 데이터셋
2. JSON 문자열 파싱하기
파일로부터가 아닌, 문자열 형식으로 JSON 데이터를 다루고자 할 때는 json.loads()
함수를 사용한다. 다음은 그 예시이다:
import json
json_string = '{"info": {"description": "이미지 설명문 추출 및 생성용 한국형 비전 데이터셋", "version": "1.0", "date_year": "2022"}}'
data = json.loads(json_string)
print(data) # 출력: {'info': {'description': '이미지 설명문 추출 및 생성용 한국형 비전 데이터셋', 'version': '1.0', 'date_year': '2022'}}
json.loads()
함수는 문자열 형식의 JSON 데이터를 파이썬 딕셔너리로 변환한다. 이를 통해 문자열로 전송된 데이터 역시 파이썬의 데이터 구조로 효율적으로 변환할 수 있다.
3. 파이썬 객체를 JSON으로 변환하기
파이썬 객체를 JSON 형식으로 직렬화하기 위해서는 json.dump()
또는 json.dumps()
함수를 사용한다. 예를 들어, 파이썬 딕셔너리를 JSON 파일로 저장하는 예시는 다음과 같다:
import json
data = {
"name": "홍길동",
"age": 30,
"isStudent": False
}
with open('output.json', 'w', encoding='utf-8') as file:
json.dump(data, file, ensure_ascii=False, indent=4)
위 코드에서 json.dump()
함수는 파이썬 객체를 JSON 파일로 저장한다. ensure_ascii=False
옵션을 사용함으로써 비ASCII 문자(예: 한글)가 올바르게 저장되도록 하며, indent=4
를 설정하여 가독성을 높이기 위한 들여쓰기를 적용한다.
문자열로 JSON 데이터를 얻고자 할 때는 json.dumps()
함수를 사용한다:
json_string = json.dumps(data, ensure_ascii=False, indent=4)
print(json_string)
json.dumps()
는 파이썬 객체를 문자열 형식의 JSON으로 변환하여, 네트워크 전송이나 로그 기록 등에서 사용될 수 있도록 한다.
정리
파이썬에서 JSON 데이터를 다루기 위해서는 json
모듈을 사용한다. JSON 파일에서 데이터를 읽어올 때는 json.load()
를, 문자열에서 JSON을 파싱할 때는 json.loads()
를 사용한다. 반대로, 파이썬 객체를 JSON 파일로 저장하고자 할 때는 json.dump()
를, 문자열로 직렬화하고자 할 때는 json.dumps()
를 사용한다. JSON은 그 구조가 파이썬의 딕셔너리와 매우 유사하여 데이터 교환 시 직관적이고 효율적인 처리가 가능하다. 이를 통해 다양한 데이터 전송 및 저장 시나리오에서 JSON의 강력한 유틸리티를 극대화할 수 있다.