JSON은 JavaScript 객체 표기법을 의미합니다. 가벼울 뿐만 아니라 사람이 읽고 쓰기에도 쉽습니다. 마찬가지로 기계도 쉽게 파싱하고 생성할 수 있습니다. JSON 구문 분석은 모든 Python 개발자가 API, 구성 파일 또는 기타 저장된 정보 소스의 데이터로 작업할 때 매우 중요합니다. 이 문서에서는 Python의 JSON 모듈을 사용하여 JSON을 구문 분석하는 기본 절차를 안내합니다.
JSON은 Python 사전과 유사하게 데이터를 키-값 쌍으로 표현합니다. 다음은 JSON 객체의 기본 예시입니다:
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"]
}
이 JSON 객체에는 문자열, 숫자, 부울, 배열이 포함됩니다. 이 구조를 이해하는 것은 Python에서 JSON 데이터를 구문 분석하고 조작하는 데 기본이 됩니다.
Python의 json 모듈을 사용하면 JSON 문자열과 파일을 간단하게 구문 분석할 수 있습니다. 이 모듈에는 문자열에서 JSON을 읽는 json.loads()와 파일에서 JSON을 읽는 json.load()와 같은 메서드가 포함되어 있습니다. 반대로 json.dumps() 및 json.dump()는 각각 문자열과 파일에 JSON을 쓰는 데 사용됩니다.
JSON 데이터를 읽는 방법에는 여러 가지가 있으며, 다음에 살펴보겠습니다.
문자열에서 JSON 데이터를 읽으려면 json.loads() 메서드를 사용합니다:
import json
json_string = '{"name": "Alice", "age": 30, "is_student": false, "courses": ["Math", "Science"]}'
data = json.loads(json_string)
print(data)
출력:
파일에서 JSON 데이터를 읽으려면 json.load() 메서드를 사용합니다:
import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
출력:
다음은 JSON 데이터를 작성하는 몇 가지 방법입니다:
JSON 데이터를 문자열에 쓰려면 json.dumps() 메서드를 사용합니다:
import json
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"]
}
json_string = json.dumps(data)
print(json_string)
출력:
JSON 데이터를 파일에 쓰려면 json.dump() 메서드를 사용합니다:
import json
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"]
}
with open('data.json', 'w') as file:
json.dump(data, file)
중첩된 JSON 객체는 보다 복잡한 데이터 구조로 작업할 때 흔히 발생합니다. Python은 이러한 중첩 구조를 쉽게 처리할 수 있습니다.
import json
nested_json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"street": "123 Main St",
"city": "Wonderland"
}
}
'''
data = json.loads(nested_json_string)
print(data['address']['city'])
출력:
사용자 정의 Python 객체를 JSON으로 변환해야 하는 경우가 있습니다. 이를 위해서는 사용자 정의 인코더가 필요합니다.
import json
class Student:
def __init__(self, name, age, is_student):
self.name = name
self.age = age
self.is_student = is_student
class StudentEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Student):
return obj.__dict__
return super().default(obj)
student = Student("Alice", 30, False)
json_string = json.dumps(student, cls=StudentEncoder)
print(json_string)
출력:
마찬가지로 JSON 데이터를 사용자 정의 파이썬 객체로 디코딩하려면 사용자 정의 디코더가 필요합니다.
import json
class Student:
def __init__(self, name, age, is_student):
self.name = name
self.age = age
self.is_student = is_student
def student_decoder(dct):
return Student(dct['name'], dct['age'], dct['is_student'])
json_string = '{"name": "Alice", "age": 30, "is_student": false}'
student = json.loads(json_string, object_hook=student_decoder)
print(student.name)
출력:
JSON 데이터로 작업할 때 특히 JSON 데이터를 구문 분석, 생성 또는 액세스할 때 몇 가지 일반적인 오류가 발생할 수 있습니다. 다음은 가장 일반적인 몇 가지 오류입니다:
JSON을 구문 분석할 때 흔히 발생하는 오류는 잘못된 JSON 형식입니다. JSON은 키와 문자열 값을 큰따옴표로 묶고 대괄호와 중괄호를 적절히 중첩해야 합니다.
import json
invalid_json_string = "{'name': 'Alice', 'age': 30, 'is_student': False}"
try:
data = json.loads(invalid_json_string)
except json.JSONDecodeError as e:
print(f"Invalid JSON format: {e}")
출력:
JSON 데이터를 구문 분석할 때 누락된 키가 발생할 수 있습니다. 누락된 키가 있는 경우 get 메서드를 사용하여 기본값을 제공하세요.
import json
json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)
is_student = data.get('is_student', False)
print(is_student)import json
json_string = '{"name": "Alice", "age": 30}'
data = json.loads(json_string)
is_student = data.get('is_student', False)
print(is_student)
pdb 모듈을 사용하여 중단점을 설정하고 JSON 구문 분석 코드를 디버깅하세요.
import json
import pdb
json_string = '{"name": "Alice", "age": 30, "is_student": false}'
pdb.set_trace()
data = json.loads(json_string)
print(data)
웹 스크래핑에는 종종 JSON 응답을 반환하는 웹 API에서 데이터를 추출하는 작업이 포함됩니다. 다음은 요청 라이브러리와 https://httpbin.org/anything 엔드포인트를 사용한 간단한 예제입니다.
먼저 요청 라이브러리가 설치되어 있는지 확인합니다:
pip install requests
이 코드는 HTTP 요청을 위한 요청과 JSON 데이터를 처리하기 위한 json을 가져옵니다. 요청.get(url)을 사용하여 대상 URL에 GET 요청을 보내고 response.json()으로 JSON 응답을 파싱하여 Python 사전으로 변환합니다. 헤더, 사용자 에이전트, 원본 및 URL과 같은 특정 데이터를 가져와서 인쇄합니다.
이 코드에는 강력한 오류 처리 기능이 포함되어 있어 JSON 디코딩 오류가 발생하면 json.JSONDecodeError를, 특정 키가 없으면 KeyError를 캡처하여 '데이터 없음' 충돌로부터 프로그램을 안전하게 보호합니다. 따라서 이러한 코드 견고성 덕분에 실제 웹 스크래핑 작업을 완벽하게 처리할 수 있습니다.
import requests
import json
url = 'https://httpbin.org/anything'
response = requests.get(url)
try:
data = response.json()
# JSON 응답에서 특정 데이터 추출하기
headers = data['headers']
user_agent = headers.get('User-Agent', 'N/A')
origin = data.get('origin', 'N/A')
url = data.get('url', 'N/A')
print(f"User Agent: {user_agent}")
print(f"Origin: {origin}")
print(f"URL: {url}")
except json.JSONDecodeError:
print("Error decoding JSON response")
except KeyError as e:
print(f"Key error: {e} not found in the JSON response")
모든 Python 코더는 JSON을 파싱하는 방법을 알아야 합니다. 이 설명서에서 강조하는 JSON 모듈과 가장 좋은 방법을 사용하면 JSON 데이터를 충분히 빠르게 읽고, 쓰고, 디버깅할 수 있습니다. 즉, 정기적으로 코드를 테스트하고 올바른 도구와 Python에서 제공되는 최신 기능을 활용하여 JSON 처리 기술을 향상시킬 수 있습니다.
웹 스크래핑을 수행할 때 웹 API에서 가져온 데이터가 일반적으로 JSON 형태로 나타난다는 사실을 고려할 때 JSON 구문 분석이 중요하다는 것을 알게 됩니다. 또한 JSON 데이터를 좋은 방식으로 구문 분석하고 조작할 수 있다면 다양한 웹 소스에서 정보를 효율적으로 추출할 수 있습니다.
댓글: 0