CodeGym /자바 코스 /Python SELF KO /json을 통한 JSON 작업

json을 통한 JSON 작업

Python SELF KO
레벨 23 , 레슨 1
사용 가능

2.1 모듈 json

JSON (JavaScript Object Notation) — 사람도 쉽게 읽고 쓸 수 있으며 컴퓨터가 쉽게 분석하고 생성할 수 있는 가벼운 데이터 교환 형식이야. JSON은 서버와 웹 애플리케이션 간 데이터 전송에 자주 사용되며, 설정과 구성 저장에도 많이 쓰이지.

모듈 json은 Python에서 직렬화 (Python 객체를 JSON 문자열로 변환)와 역직렬화 (JSON 문자열을 Python 객체로 변환) 기능을 제공해. 이 모듈은 Python의 표준 라이브러리에 내장되어 있으며, JSON 데이터를 처리할 때 활발히 사용돼.

모듈 json의 주요 함수는 pickle과 상당히 비슷하고 비슷하게 작동해. 원하던 대로 표준이니까!

  • 문자열 작업:
    • json.dumps(obj) — Python 객체를 JSON 문자열로 변환.
    • json.loads(s) — JSON 문자열을 Python 객체로 변환.
  • 파일 작업:
    • json.dump(obj, file) — Python 객체를 직렬화하여 텍스트 파일에 기록.
    • json.load(file) — JSON 형식의 데이터를 포함한 텍스트 파일에서 Python 객체를 역직렬화.

이 함수들이 어떻게 작동하는지 더 잘 기억하기 위해 몇 가지 예시를 살펴보자.

2.2 문자열로 직렬화

Python 객체를 JSON 문자열로 직렬화

객체를 문자열로 직렬화하기 위해서는 json.dumps() 함수에 객체를 전달하면 돼.


import json

# 직렬화를 위한 객체 예시
data = {
    "name": "Alice",
    "age": 30,
    "is_student": False,
    "courses": ["Math", "Science"],
    "address": {
        "city": "New York",
        "zip_code": "10001"
    }
}
            
# Python 객체를 JSON 문자열로 변환
json_string = json.dumps(data, indent=4)
print("직렬화된 데이터 (JSON):", json_string)
        

JSON 문자열을 Python 객체로 역직렬화

객체를 문자열에서 얻으려면, 객체 설명을 포함하는 JSON 문자열을 json.loads() 메서드에 전달하면 돼.


import json

# 역직렬화를 위한 JSON 문자열 예시
json_string = '''
    {
        "name": "Alice",
        "age": 30,
        "is_student": false,
        "courses": ["Math", "Science"],
        "address": {
          "city": "New York",
          "zip_code": "10001"
        }
    }
    '''
            
# JSON 문자열을 Python 객체로 변환
data = json.loads(json_string)
print("역직렬화된 데이터 (Python):", data)
        

2.3 파일로 직렬화

Python 객체를 JSON 형식으로 파일에 기록하기

객체를 파일에 기록하기 위해서는 json.dump() 메서드를 호출하면 돼. 파일 작업 시 잠재적인 오류를 제대로 처리하기 위해 예외 처리를 사용하는 것이 중요해. 다음은 예시야:


import json

# 직렬화를 위한 객체 예시
data = {
    "name": "Bob",
    "age": 25,
    "is_student": True,
    "courses": ["History", "Literature"],
    "address": {
        "city": "Los Angeles",
        "zip_code": "90001"
    }
}
            
# 예외 처리를 사용한 Python 객체의 JSON 파일 기록
try:
    with open('data.json', 'w') as file:
        json.dump(data, file, indent=4)
    print("데이터가 파일에 성공적으로 기록되었습니다.")
except IOError:
    print("파일 기록 중 오류 발생.")
except json.JSONEncodeError:
    print("JSON 인코딩 중 오류 발생.")
            
        

JSON 형식의 파일에서 Python 객체 읽기

파일에서 읽기도 매우 간단해 — 파일을 json.load() 메서드에 전달하면 돼. 여기서도 예외 처리를 사용하는 것이 중요해:


import json

# 예외 처리를 사용한 JSON 파일에서 Python 객체 읽기
try:
    with open('data.json', 'r') as file:
        data = json.load(file)
    print("파일에서 역직렬화된 데이터 (Python):", data)
except IOError:
    print("파일 읽기 중 오류 발생.")
except json.JSONDecodeError:
    print("JSON 디코딩 중 오류 발생.")
        

2.4 함수의 추가 매개변수

직렬화를 담당하는 함수에 추가 매개변수를 전달할 수 있어, 너의 JSON을 더 멋지게 만들 수 있지:

  • skipkeys: True인 경우 문자열, 숫자 또는 None이 아닌 키를 건너뜀.
  • ensure_ascii: True인 경우 모든 비-ASCII 문자는 Unicode 이스케이프 시퀀스를 사용해 이스케이프 됨.
  • indent: 숫자가 지정되면 가독성을 위해 들여쓰기가 추가됨.
  • sort_keys: True인 경우 JSON의 키가 알파벳 순서로 정렬됨.

json.dumps() 매개변수 사용 예시:


import json

data = {"c": 3, "b": 2, "a": 1}
            
# 키 정렬 및 들여쓰기로 직렬화
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
        

2.5 사용자 정의 디코더와 인코더

모듈 json은 객체의 직렬화와 역직렬화를 위한 사용자 정의 함수를 사용할 수 있어.

사용자 정의 인코더 예제

먼저 객체가 datetime 타입인 경우 객체를 ISO 형식의 문자열로 반환하는 특정 클래스 인코더를 생성해.


import json
from datetime import datetime
            
class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return obj.isoformat()
        return super().default(obj)
            
data = {
    "name": "Alice",
    "timestamp": datetime.now()
}
            
# 사용자 정의 인코더로 직렬화
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)

사용자 정의 디코더 예제

반대 작업을 위해서는 문자열을 날짜로 변환하는 함수도 필요해. 예를 들어 필드 이름이 timestamp라면 문자열을 datetime 객체로 변환할 수 있음:


import json
from datetime import datetime
        
def custom_decoder(dct):
    if 'timestamp' in dct:
        dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
    return dct
        
json_string = '''
{
    "name": "Alice",
    "timestamp": "2023-05-15T14:30:00"
}
'''
        
# 사용자 정의 디코더로 역직렬화
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
    
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION