2023년 6월 업데이트
안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, Python 초급 강좌 목차 - 17. JSON 데이터 처리를 진행토록 하겠습니다.
SQLER에서 진행되는 전체 Python / 머신러닝 강좌 목록
코드를 실행하기 위해서는, vscode에서 새로운 파일을 만들고 실행하시면 됩니다.
예를 들어, 17_json.py를 생성하고 코드를 실행합니다.
TL;DR
JSON의 구조에 대해 깊이있게 살펴보고, Python json 모듈로 JSON 데이터에 접근해 필요한 정보를 추출하는 방법을 코드로 확인합니다. 또한 Python dictionary 데이터형을 JSON으로 변환하는 방안도 리뷰합니다.
Python 초급 강좌 목차 - 17. JSON 데이터 처리
지난 개발자 커뮤니티 SQLER.com - Python 초급 강좌 목차 - 16. 외부 웹서비스 API 호출 강좌를 통해 웹 서비스에서 API를 호출해 결과를 출력하는 과정을 진행했습니다. 이번 강좌에서는 출력된 결과인 JSON 결과를 살펴보면서 JSON에 대해서 알아보는 시간을 가지도록 하겠습니다.
JSON이란 무엇이고 어떻게 사용되나요?
JSON은 표준 데이터 형식으로 수많은 서비스 간 데이터를 주고받을 때 사용되는 형식입니다. 많은 웹서비스의 API가 JSON, JavaScript Object Notation으로 데이터를 리턴합니다. JSON은 사람이 읽을 수 있고 코드로 구문을 분석하거나 생성할 수 있는 표준 형식입니다.

샘플 JSON 결과
{
"color": {
"dominantColorForeground": "White",
"dominantColorBackground": "White",
"dominantColors": [
"White"
],
"accentColor": "595144",
"isBwImg": false,
"isBWImg": false
},
"description": {
"tags": [
"bear",
"polar",
"animal",
"mammal",
"water",
"outdoor",
"large",
"walking",
"snow",
"standing"
],
"captions": [
{
"text": "a polar bear in the water",
"confidence": 0.7933424407633173
}
]
},
"requestId": "0231629e-6ae6-48e9-93c5-5bd6fe0fcf31",
"metadata": {
"height": 221,
"width": 220,
"format": "Jpeg"
}
}
샘플로 출력한 결과입니다.
이렇게 보통 JSON 결과는 길게 나열되어 사람이 알아보기 불편합니다. 여러 JSON linting 도구를 이용해 읽기 쉽게 포맷팅 할 수 있습니다. 다음 웹 사이트에서 여러 JSON Linter들을 볼 수 있습니다.
또는 pprint를 이용해 처리할 수도 있습니다.
import json
import pprint
response_data = '{"color": {"dominantColorForeground": "White", "dominantColorBackground": "White", "dominantColors": ["White"], "accentColor": "595144", "isBwImg": false, "isBWImg": false}, "description": {"tags": ["bear", "polar", "animal", "mammal", "water", "outdoor", "large", "walking", "snow", "standing"], "captions": [{"text": "a polar bear in the water", "confidence": 0.7933424407633173}]}, "requestId": "0231629e-6ae6-48e9-93c5-5bd6fe0fcf31", "metadata": {"height": 221, "width": 220, "format": "Jpeg"}}'
results = json.loads(response_data)
# 보기 어렵게 출력됩니다.
print(results)
# 포맷되어 출력됩니다.
pprint.pprint(results)
JSON linting 결과
이런 linter 서비스를 이용하면, 이런 형태로 잘 정돈되어 출력됩니다.
{
"color": {
"dominantColorForeground": "White",
"dominantColorBackground": "White",
"dominantColors": [
"White"
],
"accentColor": "595144",
"isBwImg": false,
"isBWImg": false
},
"description": {
"tags": [
"bear",
"polar",
"animal",
"mammal",
"water",
"outdoor",
"large",
"walking",
"snow",
"standing"
],
"captions": [
{
"text": "a polar bear in the water",
"confidence": 0.7933424407633173
}
]
},
"requestId": "0231629e-6ae6-48e9-93c5-5bd6fe0fcf31",
"metadata": {
"height": 221,
"width": 220,
"format": "Jpeg"
}
}
이렇게, 결과를 좀 더 수월하게 확인 가능합니다.
JSON의 구조
JSON은 두 가지 구조로 구축됩니다.
- key/value pair의 컬렉션(collection)
- 값(value)들의 list

Python에는 JSON을 인코딩하고 디코딩하는 데 도움이 되는 json 모듈이 포함되어 있습니다.
이 모듈을 이용해 JSON 결과를 파싱해 원하는 형태로 출력 가능합니다.
JSON 결과 처리 - 전체 예제
아래 코드를 실행해 결과를 보시면서, 함께 이후 강좌를 살펴보시면 더 이해가 쉬우실 겁니다.
import json
response_data = '{"color": {"dominantColorForeground": "White", "dominantColorBackground": "White", "dominantColors": ["White"], "accentColor": "595144", "isBwImg": false, "isBWImg": false}, "description": {"tags": ["bear", "polar", "animal", "mammal", "water", "outdoor", "large", "walking", "snow", "standing"], "captions": [{"text": "a polar bear in the water", "confidence": 0.7933424407633173}]}, "requestId": "0231629e-6ae6-48e9-93c5-5bd6fe0fcf31", "metadata": {"height": 221, "width": 220, "format": "Jpeg"}}'
results = json.loads(response_data)
print('requestId')
print(results['requestId'])
print('dominantColorBackground')
print(results['color']['dominantColorBackground'])
print('first_tag')
print(results['description']['tags'][0])
for item in results['description']['tags']:
print(item)
print('caption text')
print(results['description']['captions'][0]['text'])
JSON 결과에서 Key 이름으로 Value값을 추출
"key":"value" 형태로 구성된 결과에서 key 이름으로 value 값을 추출하려면, python에서 이렇게 실행합니다.
... # API requests 코드
# print the value for requestId from the JSON output
# JSON 결과에서 requestId 값을 출력합니다.
print()
print('requestId')
print (results['requestId'])

Python으로 JSON nested key에서 subkey 추출
두 개 이상의 key가 중첩되어 있을 경우에는, 이렇게 key 이름을 추가 지정하면서 탐색해 subkey value를 가져옵니다.
... # API requests 코드
# color 키에서 dominantColorBackground 값을 출력합니다.
print()
print('dominantColorBackground')
print(results['color']['dominantColorBackground'])

Python에서 나열되어 있는 JSON value 값 가져오기
나열되어 있는 JSON value들을 가져오려면, key 이름과 index 번호를 이용해 값을 가져옵니다.
... # API requests 코드
# description의 첫 번째 태그를 인쇄합니다.
print()
print('first_tag')
print(results['description']['tags'][0])

이렇게 description/tags의 0번째 index값이 bear를 가져옵니다.
Python에서 나열되어 있는 모든 value 값 가져오기
또한 많이 사용되는 패턴으로, 나열되어 있는 JSON 키의 모든 value값을 가져오려면, 이렇게 loop를 이용합니다.
... # API requests 코드
# description에 있는 모든 태그를 인쇄합니다.
print()
print('all tags')
for item in results['description']['tags']:
print(item)

Python dictionary와 JSON
지난 컬렉션 강좌에서 소개해 드린 것처럼, Dictionary 데이터형과 JSON 형식은 유사합니다.
Python dictionary 데이터형으로 JSON 개체 생성
JSON 개체를 손쉽게 dictionary 데이터형에서 생성할 수 있습니다.
import json
# Dictionary 객체 생성
person_dict = {'first': 'Christopher', 'last':'Harrison'}
# 필요에 따라 dictionary에 key/value pair를 추가합니다.
person_dict['City']='Seattle'
# Dictionary를 JSON 객체로 변환
person_json = json.dumps(person_dict)
# JSON 객체 출력
print(person_json)
JSON subkey 구조 형식 생성
Python의 중첩된 Dictionary 데이터형을 이용해 JSON subkey 구조를 생성할 수 있습니다.
import json
# Dictionary 객체 생성
person_dict = {'first': 'Christopher', 'last':'Harrison'}
# 필요에 따라 dictionary에 key/value pair를 추가
person_dict['City']='Seattle'
# staff dictionary 생성
staff_dict ={}
# person_dict를 "Program Manager"로 값 설정
staff_dict['Program Manager']=person_dict
# Dictionary를 JSON 객체로 변환
staff_json = json.dumps(staff_dict)
# JSON 객체 출력
print(staff_json)
Python List 데이터를 JSON에 추가
Python list 데이터형을 dictionary에 추가하고, 이어서 dictionary를 JSON 형식으로 변환할 수 있습니다.
import json
# Dictionary 객체 생성
person_dict = {'first': 'Christopher', 'last':'Harrison'}
# 필요에 따라 dictionary에 key/value pair를 추가
person_dict['City']='Seattle'
# List 객체를 생성
languages_list = ['CSharp','Python','JavaScript']
# List 객체를 dictionary에 languages를 key로 추가
person_dict['languages']= languages_list
# Dictionary를 JSON 객체로 변환
person_json = json.dumps(person_dict)
# JSON 객체 출력
print(person_json)
이외에도 수많은 JSON 관련 함수와 변환을 프로젝트에서 하시게 될 거에요.
Dictionary와 JSON의 변환은 정말 많이, 자주 쓰이니 잘 정리해 두시면 유용하실 겁니다.
수고 많으셨습니다.
파이썬 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.
책구매 링크: 챗GPT와 함께하는 파이썬 & 머신러닝 코딩 마스터
참고자료
개발자 커뮤니티 SQLER.com - Python 무료 강좌 - 기초, 중급, 머신러닝
json — JSON encoder and decoder — Python 3.8.7 documentation


