Skip to content

가이드

코드에서 YAML을 JSON으로 변환

변환이 브라우저 탭이 아니라 스크립트나 빌드 단계에 들어가야 할 때, 이것이 그 대응물입니다.

작성 yamltojsonfree · 게시일 · 수정일

Python, Node.js, Go, 그리고 명령줄

각 스니펫은 input.yaml을 읽어 정형화된 JSON을 출력합니다. 하지만 서로 바꿔 쓸 수는 없습니다 — 각각 아래의 메모가 그 라이브러리가 어떤 YAML 버전을 구현하는지 알려 주며, 그 차이는 데이터를 조용히 바꿀 수 있습니다.

Python

import json, yaml

with open("input.yaml") as f:
    data = yaml.safe_load(f)          # safe_load, never load()

print(json.dumps(data, indent=2))

PyYAML은 YAML 1.1을 구현하므로 여기서 no는 False가 됩니다 — 기본이 1.2인 브라우저 도구와 다릅니다.

Node.js

import { readFileSync } from "node:fs";
import { load } from "js-yaml";

const data = load(readFileSync("input.yaml", "utf8"));
console.log(JSON.stringify(data, null, 2));

js-yaml v5의 기본은 YAML 1.2입니다 — 이 사이트의 브라우저 도구와 같은 엔진, 같은 기본값입니다.

Go

import (
    "encoding/json"
    "os"
    "sigs.k8s.io/yaml"
)

in, _ := os.ReadFile("input.yaml")
out, _ := yaml.YAMLToJSON(in)
os.Stdout.Write(out)

sigs.k8s.io/yaml은 JSON 태그를 통해 변환하며, Kubernetes 자체가 사용하는 방식입니다.

Bash (yq)

# Single document
yq -o=json input.yaml

# Multi-document into a JSON array
yq -o=json -I=2 'select(document_index >= 0)' -N input.yaml

# Minified
yq -o=json -I=0 input.yaml

이것은 mikefarah/yq입니다. 다른 yq(kislyuk)는 플래그가 다른 jq 래퍼입니다.

스크립트에서 반드시 지켜야 할 세 가지

안전한 로더를 사용하세요. Python에서 로더를 명시하지 않은 yaml.load()는 태그가 붙은 YAML로부터 임의의 Python 객체를 만들 수 있습니다 — 입력이 내 것이 아니라면 그것은 코드 실행입니다. safe_load()는 일반 데이터만 파싱하며, 다른 것을 쓸 이유는 거의 없습니다.

YAML 버전을 알아 두세요. PyYAML은 YAML 1.1을 읽으므로 country: NO는 False로 나옵니다. js-yaml v5와 Go의 Kubernetes 계열 파서는 1.2를 읽으므로 같은 줄이 문자열로 유지됩니다. 한 라이브러리로 변환하고 다른 라이브러리로 검증하는 파이프라인은 스스로 모순될 수 있습니다. 영향을 받는 값의 전체 목록은 YAML 1.1과 1.2 차이 가이드에 있습니다.

다중 문서 스트림을 처리하세요. Kubernetes와 Helm 출력은 보통 ---로 구분된 여러 문서입니다. 단순한 load는 첫 번째만 읽고 나머지를 조용히 버립니다 — Python에서는 yaml.safe_load_all(), js-yaml에서는 loadAll(), 또는 위에 나온 yq 호출을 사용하면 모든 문서를 얻을 수 있습니다.

아니면 스크립트를 아예 건너뛰기

일회성 변환이라면 무료 YAML → JSON 변환기가 위의 모든 것을 브라우저에서 처리합니다: 다중 문서 스트림, 앵커와 병합 키, YAML 1.1과 1.2 모드, 정확한 줄에 고정된 오류. 어떤 것도 업로드되지 않으며 파서는 전적으로 사용자의 기기에서 실행됩니다.

참고 자료