Python에서 JSON 구문 분석 가이드

댓글: 0

JSON은 JavaScript 객체 표기법을 의미합니다. 가벼울 뿐만 아니라 사람이 읽고 쓰기에도 쉽습니다. 마찬가지로 기계도 쉽게 파싱하고 생성할 수 있습니다. JSON 구문 분석은 모든 Python 개발자가 API, 구성 파일 또는 기타 저장된 정보 소스의 데이터로 작업할 때 매우 중요합니다. 이 문서에서는 Python의 JSON 모듈을 사용하여 JSON을 구문 분석하는 기본 절차를 안내합니다.

JSON과 그 구조 이해하기

JSON은 Python 사전과 유사하게 데이터를 키-값 쌍으로 표현합니다. 다음은 JSON 객체의 기본 예시입니다:

{
    "name": "Alice",
    "age": 30,
    "is_student": false,
    "courses": ["Math", "Science"]
}

이 JSON 객체에는 문자열, 숫자, 부울, 배열이 포함됩니다. 이 구조를 이해하는 것은 Python에서 JSON 데이터를 구문 분석하고 조작하는 데 기본이 됩니다.

Python에서 JSON으로 작업하기

Python의 json 모듈을 사용하면 JSON 문자열과 파일을 간단하게 구문 분석할 수 있습니다. 이 모듈에는 문자열에서 JSON을 읽는 json.loads()와 파일에서 JSON을 읽는 json.load()와 같은 메서드가 포함되어 있습니다. 반대로 json.dumps() 및 json.dump()는 각각 문자열과 파일에 JSON을 쓰는 데 사용됩니다.

JSON 데이터 읽기

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)

출력:

1.png

파일에서 JSON 읽기

파일에서 JSON 데이터를 읽으려면 json.load() 메서드를 사용합니다:

import json

with open('data.json', 'r') as file:
    data = json.load(file)

print(data)

출력:

2.png

JSON 데이터 작성하기

다음은 JSON 데이터를 작성하는 몇 가지 방법입니다:

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)

출력:

3.png

파일에 JSON 쓰기

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 처리하기

중첩된 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'])

출력:

4.png

사용자 정의 JSON 인코더

사용자 정의 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)

출력:

5.png

사용자 정의 JSON 디코더

마찬가지로 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)

출력:

6.png

일반적인 문제 처리하기

JSON 데이터로 작업할 때 특히 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}")

출력:

7.png

누락된 키 처리하기

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)

JSON 구문 분석 문제 디버깅하기

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 처리의 실제 예제

웹 스크래핑에는 종종 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")

8.png

모든 Python 코더는 JSON을 파싱하는 방법을 알아야 합니다. 이 설명서에서 강조하는 JSON 모듈과 가장 좋은 방법을 사용하면 JSON 데이터를 충분히 빠르게 읽고, 쓰고, 디버깅할 수 있습니다. 즉, 정기적으로 코드를 테스트하고 올바른 도구와 Python에서 제공되는 최신 기능을 활용하여 JSON 처리 기술을 향상시킬 수 있습니다.

웹 스크래핑을 수행할 때 웹 API에서 가져온 데이터가 일반적으로 JSON 형태로 나타난다는 사실을 고려할 때 JSON 구문 분석이 중요하다는 것을 알게 됩니다. 또한 JSON 데이터를 좋은 방식으로 구문 분석하고 조작할 수 있다면 다양한 웹 소스에서 정보를 효율적으로 추출할 수 있습니다.

댓글:

0 댓글