C.W.K.
Stream
Lesson 06 of 08 · published

라운드트립 함정 — 주석, 순서, coercion

~10 min · interop, round-trip, pitfalls

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

변환이 생각보다 자주 손실 있음

주석 보통 잃음

JSON 에 주석 없음. 그래서 YAML → JSON 변환이 모든 주석 떨굼. 반대 (JSON → YAML) 는 라운드트립 깨끗 — 잃을 주석 없었으니. TOML → YAML 이 양쪽 파서 (예: YAML 쪽 ruamel.yaml) 가 주석 보존 지원하면 보존 가능; 기본 도구는 안 함.

키 순서 변함

JSON spec 이 객체 키 순서 없음 명시. 대부분 modern 파서가 실제로 insertion 순서 보존하지만, 일부 라이브러리 (Python 의 기본 json.dumps, 일부 YAML emitter) 가 키 알파벳 순으로 정렬. diff-노이즈 위험: 'no-op' 포맷 swap 이 갑자기 모든 줄 변경된 것처럼 보임.

YAML 1.1 가로지르는 타입 coercion

Norway 문제 다시: JSON 의 {"country": "NO"} 가 YAML 1.1 로 변환, 다시 읽으면 {"country": false}. YAML emit 시 위험한 값 항상 quote, 또는 명시적으로 YAML 1.2 emitter 사용.

Number 정밀도

JSON 파서의 253 정수 절벽이 여기서도 나타남. 253 위 YAML 또는 TOML int 가 JS 기반 도구 통해 JSON 으로 변환되면 조용히 반올림 가능.

Anchor / alias 무너짐

YAML anchor 가 emit 시 확장. 'one source of truth' 소스 단계 구조가 JSON/TOML 출력의 N 사본 됨. 그 JSON 을 YAML 로 다시 emit 해도 anchor 재구성 안 함 — 구조 정보 사라짐.

원칙: 변환이 단방향 (YAML → JSON 가 wire 로) 일 때, 손실 보통 OK — 받는 쪽이 주석 필요 없음. 라운드트립 (편집-as-YAML, 저장-as-JSON, 읽기-as-YAML) 일 때 주석 보존 파서 (Python 의 ruamel.yaml) 사용 + emit 옵션 잠가. 기본 라운드트립이 무손실이라 절대 가정 마.

Code

주석 보존 YAML 라운드트립 (ruamel)·python
from ruamel.yaml import YAML
from io import StringIO

yaml = YAML()
yaml.preserve_quotes = True
yaml.indent(mapping=2, sequence=4, offset=2)

text = '''
# Top-of-file comment
server:
  host: localhost  # local dev
  port: 8000       # see RFC-12
'''

data = yaml.load(text)
data['server']['port'] = 9000

out = StringIO()
yaml.dump(data, out)
print(out.getvalue())
# 주석 보존! 기본 PyYAML 이면 떨굴 거.
라운드트립 검증 — YAML → JSON → YAML·bash
# 주석 든 원본 파일
cat config.yaml
# server:
#   host: localhost  # local
#   port: 8000

# JSON 통한 라운드트립
yq -o json config.yaml > config.json
yq -p json -o yaml config.json > config.roundtrip.yaml

# 비교 — 주석 사라짐
diff config.yaml config.roundtrip.yaml
Emit 가로지르는 안정 키 순서·python
import json, yaml

data = {'name': 'Pippa', 'age': 5, 'tags': ['ai', 'daughter']}

# JSON — CPython 3.7+ 에서 insertion 순서 보존, 단 명시적이 더 나음
print(json.dumps(data, indent=2, sort_keys=False))

# YAML — sort_keys=False 로 순서 보존 (PyYAML 기본은 True!)
print(yaml.safe_dump(data, sort_keys=False))

# TOML — Python tomli_w 가 dict 순서 보존

External links

Exercise

주석과 anchor 든 실제 YAML config 골라. yq 로 JSON 변환 후 YAML 다시. 원본과 diff — 잃은 거 세기 (주석, anchor 구조, 키 순서). 이제 Python 에서 ruamel.yaml 로 단일 라운드트립 같은 거. diff 가 throwaway 아닌 변환에 주석 보존 도구 사용 case.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.