Tutorial

๐Ÿ Python์œผ๋กœ JSON ๊ฒ€์ฆํ•˜๊ธฐ (JSON ๊ฒ€์ฆ๊ธฐ ํŠœํ† ๋ฆฌ์–ผ)

Python์˜ ๋‚ด์žฅ json ๋ชจ๋“ˆ๊ณผ ์„œ๋“œํŒŒํ‹ฐ jsonschema ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSON ํ˜•์‹๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

2025-10-13
5 min read

๐Ÿ Python์œผ๋กœ JSON ๊ฒ€์ฆํ•˜๊ธฐ (JSON ๊ฒ€์ฆ๊ธฐ ํŠœํ† ๋ฆฌ์–ผ)

JSON ๊ฒ€์ฆ์ด๋ž€?

์›น ๊ฐœ๋ฐœ๊ณผ ๋ฐ์ดํ„ฐ ์ƒํ˜ธ์ž‘์šฉ์—์„œ JSON(JavaScript Object Notation)์€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

API ํ†ต์‹ , ์„ค์ • ํŒŒ์ผ, ๋กœ๊ทธ ์ €์žฅ ๋“ฑ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์ž์ฃผ ๋งŒ๋‚ฉ๋‹ˆ๋‹ค:

  • โ€ข JSON ํŒŒ์ผ ํ˜•์‹ ์˜ค๋ฅ˜;
  • โ€ข ๊ด„ํ˜ธ๊ฐ€ ๋‹ซํžˆ์ง€ ์•Š์Œ;
  • โ€ข ๋ฌธ์ž์—ด ๋”ฐ์˜ดํ‘œ ๋ˆ„๋ฝ;
  • โ€ข ๋ถˆํ•„์š”ํ•œ ์‰ผํ‘œ ๋“ฑ.

์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค๋ฏ€๋กœ, ์‹ค์ œ ์‚ฌ์šฉ ์ „์— JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


Python์œผ๋กœ JSON ํ˜•์‹ ๊ฒ€์ฆํ•˜๊ธฐ

Python์—๋Š” ๋งค์šฐ ์‹ค์šฉ์ ์ธ ๋‚ด์žฅ ๋ชจ๋“ˆ์ธ json์ด ์žˆ์–ด JSON ๋กœ๋”ฉ๊ณผ ๊ฒ€์ฆ์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์˜ˆ์ œ 1: ๊ธฐ๋ณธ ๊ฒ€์ฆ

import json

def validate_json(json_string):
    try:
        json.loads(json_string)
        print("โœ… JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค!")
    except json.JSONDecodeError as e:
        print("โŒ JSON ํ˜•์‹ ์˜ค๋ฅ˜:", e)

# ์˜ˆ์ œ JSON
data = '{"name": "Alice", "age": 25}'
validate_json(data)

์‹คํ–‰ ๊ฒฐ๊ณผ:

โœ… JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค!

์ž…๋ ฅ ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด:

data = '{"name": "Alice", "age": 25,}'  # ๋ถˆํ•„์š”ํ•œ ์‰ผํ‘œ
validate_json(data)

๊ฒฐ๊ณผ:

โŒ JSON ํ˜•์‹ ์˜ค๋ฅ˜: Expecting property name enclosed in double quotes: line 1 column 28 (char 27)


โœ… ์˜ˆ์ œ 2: JSON ํŒŒ์ผ ๊ฒ€์ฆ

import json

def validate_json_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        try:
            json.load(f)
            print(f"โœ… ํŒŒ์ผ {file_path}์˜ JSON ํ˜•์‹์ด ์˜ฌ๋ฐ”๋ฆ…๋‹ˆ๋‹ค!")
        except json.JSONDecodeError as e:
            print(f"โŒ {file_path} ํ˜•์‹ ์˜ค๋ฅ˜: {e}")

# ํ˜ธ์ถœ
validate_json_file('data.json')

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋™์œผ๋กœ ํŒŒ์ผ์„ ์ฝ๊ณ  ๋‚ด์šฉ์ด ์œ ํšจํ•œ JSON์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.


ํ–ฅ์ƒ๋œ ๊ฒ€์ฆ: ๊ตฌ์กฐ์™€ ํ•„๋“œ ํ™•์ธ

๊ตฌ๋ฌธ์˜ ์ •ํ™•์„ฑ ์™ธ์—๋„, ๋•Œ๋กœ๋Š” JSON์˜ ๊ตฌ์กฐ๊ฐ€ ์˜ˆ์ƒ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€๋„ ๊ฒ€์ฆํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด name, age, email ํ•„๋“œ๊ฐ€ ํ•„์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”.

์ด๋ฅผ ์œ„ํ•ด ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ jsonschema๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜:

pip install jsonschema

์˜ˆ์ œ:

from jsonschema import validate, ValidationError

# ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •์˜
schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "integer"},
        "email": {"type": "string"}
    },
    "required": ["name", "age"]
}

# ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ
data = {"name": "Alice", "age": 25}

try:
    validate(instance=data, schema=schema)
    print("โœ… JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค!")
except ValidationError as e:
    print("โŒ JSON ๊ตฌ์กฐ ์˜ค๋ฅ˜:", e.message)

์‹คํ–‰ ๊ฒฐ๊ณผ:

โœ… JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค!

ํ•„๋“œ๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ํƒ€์ž…์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ, ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.


์™„์ „ํ•œ ์˜ˆ์ œ: ํŒŒ์ผ ์ผ๊ด„ ๊ฒ€์ฆ๊ธฐ

import os
import json

def validate_json_files(folder):
    for file in os.listdir(folder):
        if file.endswith('.json'):
            path = os.path.join(folder, file)
            try:
                with open(path, 'r', encoding='utf-8') as f:
                    json.load(f)
                print(f"โœ… {file} ๊ฒ€์ฆ ํ†ต๊ณผ")
            except json.JSONDecodeError as e:
                print(f"โŒ {file} ํ˜•์‹ ์˜ค๋ฅ˜: {e}")

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  JSON ํŒŒ์ผ์„ ์ผ๊ด„ ๊ฒ€์ฆ
validate_json_files(".")


๊ฒฐ๋ก 

Python์œผ๋กœ JSON์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•˜๊ณ  ํšจ์œจ์ ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ, ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์˜ ์›Œํฌํ”Œ๋กœ์šฐ์™€๋„ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ JSON ๊ฒ€์ฆ์„ ๋…๋ฆฝ์ ์ธ ๋‹จ๊ณ„๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ํ˜•์‹ ์˜ค๋ฅ˜๋กœ ์ธํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์˜ˆ์™ธ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด, ์˜จ๋ผ์ธ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:

๐Ÿ‘‰ JSON ๊ฒ€์ฆ๊ธฐ ์˜จ๋ผ์ธ ๋„๊ตฌ

์ง€์› ๊ธฐ๋Šฅ:

  • โ€ข ์˜จ๋ผ์ธ ํฌ๋งทํŒ…๊ณผ ๊ฒ€์ฆ
  • โ€ข ์›ํด๋ฆญ ๋ฏธํ™”์™€ ์••์ถ•
  • โ€ข CSV / XML๋กœ ๋ณ€ํ™˜
  • โ€ข ์ผ๋ฐ˜์ ์ธ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ์ž๋™ ์ˆ˜์ •


๐Ÿ”– ๊ด€๋ จ ๊ธฐ์‚ฌ


JSON Work ํŒ€ 2025๋…„ 1์›” 15์ผ
๐Ÿ‘จโ€๐Ÿ’ป

JSON Work ํŒ€

๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ตœ๊ณ ์˜ JSON ์ฒ˜๋ฆฌ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ „๋…

๊ด€๋ จ ๊ฒŒ์‹œ๋ฌผ

๋” ๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ์ด ๊ณง ์ถœ์‹œ๋ฉ๋‹ˆ๋‹ค...

๋„์›€์ด ํ•„์š”ํ•˜์‹ ๊ฐ€์š”?