[Python 모듈] json : 데이터를 파싱하고, 생성하는 모듈

 

0. JSON 파일이란?

 

JSON(JavaScript Object Notation) 은 경량 데이터 교환 형식으로, 데이터를 텍스트 형식으로 표현합니다. JSON 형식은 JavaScript에서 객체를 표현하는 방식을 따르고 있기 때문에, JavaScript와 다른 언어 간에 데이터를 교환할 때 자주 사용됩니다.

 

JSON 파일 형식은 다음과 같습니다.

 

  • 데이터는 키-값 쌍(key-value pair)으로 표현됩니다.
  • 키는 문자열이고, 값은 문자열, 숫자, 불리언(true/false), 객체, 배열 또는 null일 수 있습니다.
  • 객체는 중괄호({})로 둘러싸이며, 키-값 쌍을 쉼표(,)로 구분합니다.
  • 배열은 대괄호([])로 둘러싸이며, 값들을 쉼표(,)로 구분합니다.

 

예시에서 JSON 객체는 이름, 나이, 결혼여부, 자녀, 취미라는 키를 가지고 있으며, 자녀 키의 값은 또 다른 JSON 객체들을 포함하는 배열입니다. 취미 키의 값은 문자열들을 포함하는 배열입니다.

{
  "이름": "홍길동",
  "나이": 30,
  "결혼여부": false,
  "자녀": [
    {
      "이름": "홍길순",
      "나이": 5
    },
    {
      "이름": "홍길철",
      "나이": 7
    }
  ],
  "취미": ["독서", "영화", "운동"]
}

 


1. json 모듈이란?

 

json 모듈은 파이썬 내장 모듈 중 하나로, JSON 데이터를 파싱하고, 생성하는 모듈입니다. 

 

json모듈은 별도의 설치 과정이 필요없습니다. 모듈을 사용하려면 아래와 같이 import를 하면 됩니다.

import json

 


2. json.dumps

 

json.dumps는 파이썬 객체를 JSON 형식으로 *직렬화(serializing)하는 함수입니다. 즉, 파이썬 객체를 JSON 문자열로 변환하는 역할을 합니다. 이 함수는 인자로 들어온 Python 객체를 JSON 형식으로 변환하여 문자열로 반환합니다. 이때 JSON 형식으로 변환되지 않는 데이터가 있는 경우 TypeError 예외가 발생합니다.

 

*직렬화는 데이터 구조나 객체를 저장하거나 전송하기 쉽게 바이트 스트림 형태로 변환하는 과정입니다. 이렇게 변환된 데이터는 파일에 저장하거나 네트워크를 통해 전송할 수 있으며, 필요한 경우 다시 원래의 데이터 구조나 객체로 복원할 수 있습니다.

 

코드에서는 dumps 함수를 사용하여 파이썬 객체를 JSON 형식으로 변환하여 문자열로 출력합니다. 

import json

data = {"name": "Alice", "age": 25, "city": "New York"}
json_string = json.dumps(data)

print(json_string)

 


3. json.loads

 

json.loads는 JSON 형식의 문자열을 파이썬 객체로 역직렬화(deserializing)하는 함수입니다. 즉, JSON 문자열을 파이썬 객체로 변환하는 역할을 합니다. 이 함수는 인자로 들어온 JSON 형식의 문자열을 파싱하여, 파이썬의 기본 데이터 타입(문자열, 숫자, 리스트, 딕셔너리 등)으로 변환합니다. 이때, JSON 형식에 맞지 않는 데이터가 있는 경우 ValueError 예외가 발생합니다.

 

코드에서는 loads 함수를 사용하여 JSON 형식의 문자열을 파이썬 객체로 변환하여 출력합니다. 

import json

json_string = '{"name": "Alice", "age": 25, "city": "New York"}'
data = json.loads(json_string)

print(data)

 


4. json.dump

 

json.dump는 파이썬 객체를 JSON 형식으로 직렬화하여 파일에 쓰는 함수입니다. 이 함수는 인자로 들어온 파이썬 객체를 JSON 형식으로 변환하여 파일에 저장합니다. 이때, 파일에는 JSON 형식으로 변환된 문자열이 쓰여지며, 파일은 *텍스트 모드로 열립니다.

 

*텍스트 모드란 파일을 텍스트 형식으로 열어서 읽고 쓰는 모드를 말합니다. 이 모드에서 파일에 쓰이는 데이터는 모두 문자열로 취급되며, 파일에 저장될 때는 문자열로 인코딩되어 저장됩니다. 즉 파일 내용을 바이너리 형식으로 처리하지 않고, 문자열 형태로 처리합니다.

 

코드에서는 dump 함수를 사용하여 파이썬 객체를 JSON 형식으로 변환하여 "data.json" 파일에 저장합니다. 

import json

data = {"name": "Alice", "age": 25, "city": "New York"}

with open("data.json", "w") as f:
    json.dump(data, f)

 


5. json.load

 

json.load는 파일에서 JSON 데이터를 읽어들여, 파이썬 객체로 역직렬화(deserializing)하는 함수입니다. load 함수는 인자로 들어온 파일 객체에서 JSON 형식의 데이터를 읽어들여, 파이썬의 기본 데이터 타입(문자열, 숫자, 리스트, 딕셔너리 등)으로 변환합니다. 이때, JSON 형식에 맞지 않는 데이터가 있는 경우 ValueError 예외가 발생합니다.

 

코드에서는 load 함수를 사용하여 "data.json" 파일에서 JSON 형식의 데이터를 읽어들여, 파이썬 객체로 변환하여 출력합니다.

import json

with open("data.json", "r") as f:
    data = json.load(f)

print(data)

 


6. 연습 예제

 

아래 코드의  JSON은 다음과 같은 구조를 가지고 있습니다.

 

  • "name", "age", "city" 필드는 문자열과 숫자 데이터 타입을 갖습니다.
  • "pets" 필드는 리스트 데이터 타입을 갖습니다. 리스트 안에는 각각 딕셔너리 데이터 타입을 갖습니다.
  • "friends" 필드는 리스트 데이터 타입을 갖습니다. 리스트 안에는 각각 딕셔너리 데이터 타입을 갖습니다.
  • "contact" 필드는 딕셔너리 데이터 타입을 갖습니다.

 

json 모듈의 loads 함수를 사용하여 JSON 문자열을 파이썬 객체로 변환합니다. 이를 통해 각 필드에 접근하여 값을 출력할 수 있습니다. 

import json

json_string = """
{
    "name": "Alice",
    "age": 25,
    "city": "New York",
    "pets": [
        {"name": "Fluffy", "type": "cat"},
        {"name": "Buddy", "type": "dog"}
    ],
    "friends": [
        {"name": "Bob", "age": 30},
        {"name": "Charlie", "age": 28},
        {"name": "Dave", "age": 27}
    ],
    "contact": {
        "phone": "123-456-7890",
        "email": "alice@example.com"
    }
}
"""

data = json.loads(json_string)

print(data["name"]) # "Alice"
print(data["pets"][0]["name"]) # "Fluffy"
print(data["friends"][2]["age"]) # 27
print(data["contact"]["phone"]) # "123-456-7890"

 

위에서 주어진 JSON 데이터를 저장한 파일 "data.json"이 있다고 가정하면 코드에서는 open 함수를 사용하여 "data.json" 파일을 열고, json 모듈의 load 함수를 사용하여 JSON 데이터를 파이썬 객체로 변환합니다. 이를 통해 각 필드에 접근하여 값을 출력할 수 있습니다. 

import json

with open("data.json", "r") as f:
    data = json.load(f)

print(data["name"]) # "Alice"
print(data["pets"][0]["name"]) # "Fluffy"
print(data["friends"][2]["age"]) # 27
print(data["contact"]["phone"]) # "123-456-7890"