YAML to JSON 변환: 구성 파일을 깨뜨리는 함정

발행: (2026년 3월 25일 PM 12:25 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

YAML과 JSON은 동일한 데이터 구조—객체, 배열, 문자열, 숫자, 불리언, 그리고 null—를 나타내므로 변환은 간단해야 합니다. 실제로는 YAML의 기능과 특이점 때문에 과정이 놀라울 정도로 위험합니다.

불리언 강제 변환

YAML은 특정 문자열을 자동으로 비문자열 타입으로 해석합니다:

country: NO

당신은 다음과 같이 기대합니다:

{"country": "NO"}

하지만 실제로는 다음과 같이 나옵니다:

{"country": false}

YAML은 "NO"를 부울 false로 처리합니다. 마찬가지로 "YES"true, "on"true, "off"false가 됩니다. 이는 흔히 **“노르웨이 문제”**라고 불립니다. 노르웨이(NO)의 국가 코드를 나타내려면 따옴표로 감싸야 합니다:

country: "NO"

숫자 및 날짜 강제 변환

다른 놀라운 타입 변환:

version: 1.0      # Becomes number 1, not string "1.0"
version: 1.10     # Becomes number 1.1, not string "1.10"
octal: 0777       # Becomes decimal 511 in YAML 1.1
date: 2024-01-15  # Becomes a Date object, not a string

version: 1.10 경우는 특히 위험합니다: 문자열 "1.10"을 기대했지만 숫자 1.1을 얻게 됩니다. 버전 비교에서는 1.11.10이 크게 다릅니다. 해결 방법은 오해될 수 있는 문자열을 따옴표로 감싸는 것입니다:

version: "1.10"

멀티라인 문자열

YAML은 여러 멀티라인 문자열 구문을 제공합니다:

# Literal block (preserves newlines)
description: |
  Line one
  Line two
  Line three

# Folded block (joins lines with spaces)
description: >
  This is all
  one paragraph
  on one line.

# With chomp indicators
trailing_newline: |+
  Keeps trailing newlines

no_trailing: |-
  No trailing newline

JSON에는 멀티라인 문자열 구문이 없으며, 모든 줄바꿈은 \n으로 이스케이프해야 합니다.

Literal block (|)은 다음과 같이 변환됩니다:

{"description": "Line one\nLine two\nLine three\n"}

Folded block (>)은 다음과 같이 변환됩니다:

{"description": "This is all one paragraph on one line.\n"}

Trailing‑newline 동작(기본값: 하나의 trailing newline, +는 모두 유지, -는 제거)은 정확한 문자열 매칭에 영향을 미치며 올바르게 처리되어야 합니다.

주석

YAML은 주석을 지원하지만 JSON은 지원하지 않습니다.

# This is a database configuration
database:
  host: localhost  # Change for production
  port: 5432

JSON으로 변환하면 모든 주석이 사라집니다:

{
  "database": {
    "host": "localhost",
    "port": 5432
  }
}

이는 일방향 데이터 손실입니다. YAML을 JSON으로 변환했다가 다시 YAML로 되돌리면 주석이 사라집니다—주석이 중요한 맥락을 제공하는 구성 파일에서는 문제가 됩니다.

앵커와 별칭 (참조)

YAML은 앵커와 별칭을 통해 매핑을 재사용할 수 있습니다:

defaults: &defaults
  timeout: 30
  retries: 3

production:
  <<: *defaults
  host: prod.example.com

staging:
  <<: *defaults
  host: staging.example.com
  • &defaults는 앵커를 정의합니다.
  • *defaults는 이를 참조합니다.
  • <<는 참조된 매핑을 병합합니다.

JSON에는 이에 상응하는 기능이 없으므로, 변환기는 모든 참조를 인라인으로 해결해야 합니다:

{
  "defaults": {"timeout": 30, "retries": 3},
  "production": {"timeout": 30, "retries": 3, "host": "prod.example.com"},
  "staging": {"timeout": 30, "retries": 3, "host": "staging.example.com"}
}

JSON 출력에서는 데이터가 중복되어 파일 크기가 증가하고, 단일 진실 원본(single‑source‑of‑truth) 이점이 사라집니다.

Ordering

YAML 매핑과 JSON 객체는 사양상 순서가 없지만, 실제로 YAML 파일은 인간이 보존되기를 기대하는 의도된 순서대로 작성됩니다. 대부분의 변환기는 삽입 순서를 유지하지만, 이는 보장되지 않습니다.

강력한 변환기

다음과 같은 모든 엣지 케이스를 처리하는 YAML‑to‑JSON 변환기를 만들었습니다:

  • 불리언 강제 변환 경고
  • 다중 행 문자열 변환
  • 앵커 해석
  • 주석 제거 (경고와 함께)

다음 주소에서 사용해 볼 수 있습니다 zovo.one/free-tools/yaml-to-json-converter. 또한 역방향을 위한 JSON‑to‑YAML 변환도 지원합니다.

0 조회
Back to Blog

관련 글

더 보기 »

맙소사, .env 파일이 싫어

댓글 > vincentabolarin https://news.ycombinator.com/user?id=vincentabolarin – 23분 전 https://news.ycombinator.com/item?id=47501509 > Nothing like cha...