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` 모듈을 다양하게 활용할 수 있는 방법들이 있으니, 좀 더 깊이 있는 예제나 다른 모듈과의 활용법이 궁금하시면 언제든지 질문해 주세요!




댓글

이 블로그의 인기 게시물

js 스트링에서 요소 갯수 세기

STUDY

javascript cheatsheet