python json 다루기
Python에서는 `json` 모듈을 사용하여 JSON 데이터를 다룰 수 있습니다. 이 모듈을 사용하면 JSON 형식의 문자열을 파이썬의 데이터 타입으로 변환하거나, 파이썬의 데이터 타입을 JSON 형식의 문자열로 변환할 수 있습니다.
기본적으로 사용하는 함수는 다음과 같습니다:
1. `json.loads()`: JSON 형식의 문자열을 파이썬 데이터 타입으로 변환 (parsing)
2. `json.dumps()`: 파이썬 데이터 타입을 JSON 형식의 문자열로 변환 (encoding)
3. `json.load()`: 파일에서 JSON 형식의 문자열을 읽어서 파이썬 데이터 타입으로 변환
4. `json.dump()`: 파이썬 데이터 타입을 JSON 형식으로 파일에 저장
아래에 각각의 예시를 보여드릴게요.
### 1. `json.loads()`와 `json.dumps()` 사용 예시
```python
import json
# JSON 문자열을 파이썬 데이터 타입으로 변환 (Parsing)
json_str = '{"name": "John", "age": 30, "city": "New York"}'
python_data = json.loads(json_str)
print(python_data)
# 출력: {'name': 'John', 'age': 30, 'city': 'New York'}
# 파이썬 데이터 타입을 JSON 문자열로 변환 (Encoding)
python_dict = {"name": "Alice", "age": 25, "city": "London"}
json_data = json.dumps(python_dict)
print(json_data)
# 출력: {"name": "Alice", "age": 25, "city": "London"}
```
### 2. `json.load()`와 `json.dump()` 사용 예시
```python
import json
# JSON 파일을 읽어 파이썬 데이터 타입으로 변환
with open('data.json', 'r') as file:
python_data = json.load(file)
print(python_data)
# 출력 예시: {'name': 'John', 'age': 30, 'city': 'New York'}
# 파이썬 데이터 타입을 JSON 파일로 저장
data_to_save = {"name": "Alice", "age": 25, "city": "London"}
with open('output.json', 'w') as file:
json.dump(data_to_save, file, indent=4) # indent=4는 출력될 JSON을 보기 좋게 들여쓰기 함
```
### 함수 설명
1. `json.loads()`: 문자열 형태의 JSON 데이터를 파이썬의 딕셔너리나 리스트와 같은 데이터 타입으로 변환합니다.
2. `json.dumps()`: 파이썬의 딕셔너리나 리스트를 JSON 형식의 문자열로 변환합니다. `indent` 옵션을 사용하여 출력 형태를 지정할 수 있습니다.
3. `json.load()`: 파일 객체를 인자로 받아 파일의 내용을 읽어 파싱하여 파이썬 데이터 타입으로 반환합니다.
4. `json.dump()`: 파이썬 데이터 타입을 JSON 형식으로 파일에 저장합니다. `indent` 옵션을 사용하여 JSON 파일을 보기 좋게 저장할 수 있습니다.
이처럼 `json` 모듈을 사용하면 JSON 데이터를 쉽게 파싱하고 저장할 수 있습니다. 추가적으로 궁금한 부분이나 자세한 설명이 필요하면 말씀해 주세요!
`json` 모듈은 기본적인 기능 외에도 몇 가지 더 활용할 수 있는 옵션과 팁이 있습니다. 예를 들어, 파일을 효율적으로 읽고 쓰기 위한 옵션이나, 커스텀 객체를 JSON 형식으로 변환하는 방법 등이 있습니다. 조금 더 심화된 내용과 함께 몇 가지 추가 예시를 소개할게요.
## 1. JSON 파일의 Pretty-Print
`json.dumps()`를 사용할 때 `indent`와 `sort_keys` 옵션을 추가하면 JSON을 가독성 있게 포맷할 수 있습니다.
```python
import json
data = {"name": "Alice", "age": 25, "city": "London", "hobbies": ["reading", "swimming"]}
# JSON 데이터를 들여쓰기와 키 정렬을 적용해 출력
pretty_json = json.dumps(data, indent=4, sort_keys=True)
print(pretty_json)
```
- `indent=4`: 들여쓰기를 4칸으로 설정하여 출력
- `sort_keys=True`: 키를 알파벳 순서로 정렬하여 출력
## 2. JSON 파일의 유니코드 처리
`json.dumps()`는 기본적으로 유니코드를 이스케이프 시켜서 출력합니다. 만약 이스케이프를 방지하고 싶다면 `ensure_ascii=False`를 설정해 주세요.
```python
import json
data = {"name": "홍길동", "city": "서울"}
# 유니코드 이스케이프를 방지하여 출력
json_data = json.dumps(data, ensure_ascii=False)
print(json_data)
# 출력: {"name": "홍길동", "city": "서울"}
```
- `ensure_ascii=False`: JSON 문자열이 유니코드 문자 그대로 출력되도록 설정
## 3. 파이썬 객체를 JSON으로 저장할 때 커스텀 인코더 사용하기
파이썬의 복잡한 객체(예: `datetime` 객체) 등을 JSON으로 변환하려면 커스텀 인코더를 정의해야 합니다. `default` 매개변수를 사용하면 자동으로 처리되지 않는 타입을 변환할 수 있습니다.
```python
import json
from datetime import datetime
# datetime 객체를 포함한 데이터
data = {"name": "Alice", "created_at": datetime.now()}
# datetime을 문자열로 변환하는 함수
def datetime_converter(obj):
if isinstance(obj, datetime):
return obj.strftime("%Y-%m-%d %H:%M:%S") # 원하는 형식으로 변환
raise TypeError("Type not serializable")
# 커스텀 인코더를 사용하여 JSON으로 변환
json_data = json.dumps(data, default=datetime_converter, indent=4)
print(json_data)
```
## 4. JSON을 특정 파이썬 객체로 변환하기
`json.loads()`는 기본적으로 JSON을 파이썬의 `dict` 타입으로 변환합니다. 하지만 `object_hook` 옵션을 사용하면 JSON을 특정 객체로 변환할 수 있습니다.
```python
import json
# 변환할 JSON 문자열
json_str = '{"name": "Alice", "age": 25}'
# 커스텀 객체로 변환할 클래스 정의
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# JSON을 Person 객체로 변환하는 함수
def as_person(dct):
return Person(dct['name'], dct['age'])
# JSON을 Person 객체로 변환
person_obj = json.loads(json_str, object_hook=as_person)
print(type(person_obj)) # 출력: <class '__main__.Person'>
print(person_obj.name) # 출력: Alice
print(person_obj.age) # 출력: 25
```
- `object_hook=as_person`: `json.loads()`가 각 객체를 생성할 때 `as_person` 함수를 호출하여 커스텀 클래스로 변환
## 5. JSON의 중첩된 데이터 접근 및 변환
중첩된 JSON 데이터를 파싱하고 특정 키에 접근할 때는 `dict` 메서드나 `jsonpath`와 같은 라이브러리를 사용할 수 있습니다.
```python
import json
json_str = '''
{
"name": "Alice",
"age": 25,
"address": {
"city": "London",
"postal_code": "12345"
},
"hobbies": ["reading", "swimming"]
}
'''
# JSON 문자열을 파싱하여 파이썬 데이터로 변환
data = json.loads(json_str)
# 중첩된 데이터에 접근
print(data['address']['city']) # 출력: London
print(data['hobbies'][1]) # 출력: swimming
```
## 6. `jsonlines` 모듈을 사용한 JSON Lines 처리
여러 개의 JSON 객체가 한 파일에 각각의 줄로 나뉘어 있는 경우 `jsonlines` 모듈을 사용할 수 있습니다.
```python
import jsonlines
data = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 30}
]
# JSON Lines로 파일 저장
with jsonlines.open('data.jsonl', mode='w') as writer:
writer.write_all(data)
# JSON Lines 파일 읽기
with jsonlines.open('data.jsonl') as reader:
for obj in reader:
print(obj)
```
## 7. 기타 활용 팁
- **파일 크기가 큰 경우**: `json` 대신 `ujson`, `orjson`과 같은 고성능 JSON 파서를 사용할 수 있습니다.
- **Dictionary key 타입이 복잡한 경우**: `Tuple`과 같은 키를 사용하려면 `json` 대신 `pickle` 모듈을 사용하는 것이 좋습니다.
이 외에도 `json` 모듈을 다양하게 활용할 수 있는 방법들이 있으니, 좀 더 깊이 있는 예제나 다른 모듈과의 활용법이 궁금하시면 언제든지 질문해 주세요!
댓글
댓글 쓰기