JSON
JSON은 API, 어노테이션, 모델 출력에 사용되는 객체, 배열, 값으로 구성된 텍스트 형식입니다. 구문 규칙, ML 활용, JSON Lines, 코드를 다룹니다.
JSON은 JavaScript 객체 표기법의 약자로, 구조화된 데이터를 저장하고 교환하는 데 사용하는 가볍고 텍스트 기반인 형식입니다. Douglas Crockford가 2000년대 초에 이를 명세했으며, JavaScript의 객체 리터럴 구문을 바탕으로 했습니다. 현재는 IETF RFC 8259와 ECMA-404 표준으로 제정되어 있습니다. JSON은 언어에 독립적이고 사람이 읽기 쉬우며, 거의 모든 프로그래밍 언어의 표준 라이브러리에서 파싱할 수 있어 웹 API의 기본 형식으로 사용됩니다. 머신러닝 (ML)에서는 추론 엔진의 예측 결과를 전달하고, 데이터셋 어노테이션을 저장하며, 실험 메타데이터를 기록하고, 대규모 언어 모델 (LLMs)의 구조화된 출력을 정의합니다.
JSON 구문#
JSON 문서는 두 가지 컨테이너와 네 가지 종류의 값으로 구성됩니다.
- 객체: 중괄호로 묶인 순서가 없는 키-값 쌍입니다. 예를 들면
{"name": "bus", "confidence": 0.94}과 같습니다. 키는 큰따옴표로 묶은 문자열이어야 합니다. - 배열: 대괄호로 묶인 순서가 있는 목록입니다. 예를 들면
[48.5, 398.0, 245.3, 902.1]과 같습니다. - 값: 문자열, 숫자, 리터럴
true,false,null, 또는 중첩된 객체와 배열입니다.
이 형식은 엄격합니다. 주석, 후행 쉼표, 작은따옴표로 묶은 문자열, 값 NaN 및 Infinity은 허용되지 않습니다. 하지만 Python의 json 모듈은 allow_nan=False를 설정하지 않으면 기본적으로 NaN를 기록하므로, 엄격한 파서가 거부하는 파일이 만들어집니다. RFC 8259는 숫자가 IEEE 754 배정밀도 범위 안에서만 안정적으로 교환된다고도 경고합니다. 따라서 일부 데이터베이스 ID처럼 2^53 − 1보다 큰 정수는 문자열로 전송하는 경우가 많습니다.
머신러닝 워크플로에서의 JSON#
보안 시스템의 카메라가 프레임을 객체 탐지 서비스로 보내면, 모델 서빙 계층은 일반적으로 JSON으로 응답합니다. 탐지된 객체마다 클래스, 신뢰도 점수, 바운딩 박스 좌표를 포함한 레코드 하나를 반환하며, 이는 대시보드, 모바일 앱, MongoDB와 같은 문서 데이터베이스에서 바로 사용할 수 있습니다.
어노테이션 형식도 JSON을 활용합니다. COCO 데이터셋은 분할의 모든 라벨을 하나의 JSON 파일에 저장하며, 여기에는 세 가지 주요 목록이 있습니다. images은 파일 이름과 크기를, categories는 클래스 ID와 이름을, annotations은 각 항목이 ID로 이미지와 카테고리를 가리키고 왼쪽 위 모서리 기준 픽셀 단위의 상자를 [x, y, width, height]로 저장합니다. 반면 YOLO 형식은 이미지마다 정규화된 중심 좌표를 포함하는 텍스트 파일 하나를 사용합니다. 두 형식 간의 변환은 데이터 어노테이션 파이프라인의 일반적인 단계입니다.
JSON Lines은 NDJSON이라고도 하며, 각 줄에 완전한 JSON 객체 하나를 배치합니다. 따라서 문서 전체를 파싱하지 않고도 파일에 데이터를 추가하거나, 스트리밍하거나, 분할할 수 있어 학습 로그, 예측 스트림, LLM을 파인튜닝하는 데 사용하는 지시 데이터셋에 적합합니다. LLM의 경우 JSON Schema는 애플리케이션이 기대하는 정확한 필드를 설명하며, 구조화된 출력과 함수 호출은 모델이 이에 부합하는 JSON을 생성하도록 제약합니다. RFC 7946으로 표준화된 GeoJSON은 이 형식을 지리적 피처에 적용하여 위성 이미지 분석 결과를 지도에 표시할 수 있게 합니다.
예측 결과를 JSON으로 변환#
Ultralytics YOLO Results 객체는 to_json()을 사용해 예측 결과를 직렬화합니다. 탐지마다 클래스 이름, 클래스 ID, 신뢰도, 상자 모서리 좌표 x1, y1, x2, y2를 포함한 레코드 하나를 기록하며, 인스턴스 세그멘테이션 및 포즈 추정 모델의 경우 마스크 또는 키포인트 좌표도 기록합니다. 다음 예제는 샘플 이미지에 YOLO26을 실행하고 Python 표준 라이브러리로 JSON을 다시 파싱합니다.
import json
from ultralytics import YOLO
# 사전 학습된 YOLO26 탐지 모델을 불러와 추론을 실행합니다
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# 모든 탐지 결과를 JSON 문자열로 직렬화합니다(normalize=True로 설정하면 상자 좌표를 0~1 범위로 정규화합니다).
json_string = result.to_json()
# 어떤 JSON 파서로든 다시 읽을 수 있으며, 여기서는 Python dict 목록으로 불러옵니다.
detections = json.loads(json_string)
print(json.dumps(detections[0], indent=2))출력된 레코드는 name, class, confidence 키와 픽셀 단위의 모서리 좌표를 담은 중첩 box 객체가 포함된 JSON 객체입니다.
JSON과 관련 형식 비교#
- YAML: 주석과 들여쓰기 기반의 중첩을 지원하는, 가독성이 더 높은 형식으로 학습 설정과 데이터셋 정의에 널리 사용됩니다. YAML 1.2는 JSON의 상위 집합으로 설계되었으므로 대부분의 JSON 문서는 유효한 YAML이기도 합니다.
- XML: Pascal VOC 어노테이션에 사용되는 태그 기반 형식으로, JSON보다 장황하며 속성, 네임스페이스, 스키마를 지원합니다.
- CSV: 표 형식 데이터에 적합하고 간결하지만 객체나 목록을 중첩할 수 없는 평면 테이블 형식입니다.
- 바이너리 형식: Protocol Buffers와 MessagePack은 JSON보다 크기가 작고 파싱 속도가 빠르지만 사람이 읽을 수는 없습니다. ONNX 모델 파일은 Protocol Buffers 메시지로 저장됩니다.










