YAML 이 나를 제대로 태웠을 때,그것은 국가 코드였습니다. 나는 Laravel 프로젝트에서 로케일 구성을 옮기고 있었다's JSON 파일을 배포 친화적 인 YAML 형식으로,내가 갔을 때 손으로 변환하는 것은 "it's 단지 중괄호를 들여쓰기로 변경했기 때문입니다." 항목 중 하나는 노르웨이였습니다: "country": "NO". 인용되지 않은 YAML에서는 문자열이 아닙니다. PyYAML 및 기타 많은 파서가 여전히 적용되는 YAML 1.1 규칙에 따라 NO 는 부울 false. Python으로 작성된 배포 스크립트는 노르웨이 사용자를 다음과 같이 유쾌하게 평가했습니다 country: false 그리고 그들을 폴백 로케일로 라우팅했습니다. 이 버그에는 이름이 있습니다. 커뮤니티에서는 이를 노르웨이 문제라고 부릅니다. 저는 이 버그를 장인적인 방식으로 발견하게 되었습니다. 한 번에 하나의 혼란스러운 지원 티켓입니다.
JSON 을 YAML 로 손으로 변환하는 것은 사소한 것처럼 보이며 실제로 지뢰밭입니다. 왜냐하면 두 형식은 맨 단어가 의미하는 바에 대해 격렬하게 다른 아이디어를 가지고 있기 때문입니다. JSON 에서는 모든 것이 명시적입니다: 문자열에는 따옴표,숫자 don't, true/false/null 는 키워드, 이야기의 끝입니다. YAML에서는 인용되지 않은 스칼라가 가져옵니다 해석된: no 거짓이 되고, 3000 는 정수가 되고, 1.10 플로트가 됩니다 1.1 (안녕, 버전 문자열), 08 일부 파서를 유효하지 않은 8진수로 질식시키고, 콜론 공간을 벗어난 값은 예상하지 못한 경우 중첩된 맵이 됩니다. 이들 모두는 자동 데이터 손상입니다. 파일은 잘 구문 분석되고 유형은 잘못되었습니다.
A JSON 에서 YAML 변환기 이러한 규칙을 이해하면 YAML이 룰렛 유형 없이 발명된 가독성을 얻을 수 있습니다. Toolz.dev용으로 만든 것은 모든 모호한 스칼라, 즉 부울 유사, 숫자 유사, YAML 1.1 레거시 값, 특수 문자가 있는 문자열을 감지하고 정확하게 인용하므로 JSON의 문자열은 다음 도구가 YAML을 구문 분석한 후에도 여전히 문자열입니다. 그 "정확히 those" 문제: 인용 모든 안전할 수도 있지만 출력은 관용적 YAML처럼 보이지 않으며 관용적 표현이 핵심입니다.
이 가이드는 변환이 YAML's 날카로운 모서리를 처리하는 방법,왜 JSON 이 기술적으로 이미 YAML 인지 (그리고 왜 그 사실이 당신을 돕는지't), 그리고 쿠버네티스,CI, 도커에서 매주 이러한 변환이 일어나는 워크플로우를 작성합니다.
TL;DR: JSON을 붙여넣습니다 Toolz.dev JSON 을 YAML 변환기로2칸 또는 4칸 들여쓰기를 선택하고 유형 안전 인용으로 깨끗한 블록 스타일 YAML을 얻으세요
"3000"문자열을 유지합니다"no"문자열을 유지합니다"1.10"버전을 유지합니다. 키 순서는 보존되고 빈 컬렉션은 다음과 같이 나옵니다[]그리고{}그리고 모든 것이 클라이언트 측에서 실행되므로 비밀로 구성하면 브라우저를 떠나지 않습니다. Round-trip back with the 야엘 검증인그리고 먼저 소스의 형식을 지정합니다 JSON 포맷터.
Isn't JSON 이미 유효한 YAML?
예 - 그리고 it's 가장 쓸모없는 "yes" 구성 관리에서. YAML 1,2 는 명시적으로 JSON 의 슈퍼세트로 설계되었습니다: 모든 유효한 JSON 문서는 유효한 YAML 로 구문 분석됩니다. 원시 JSON 을 Kubernetes 매니페스트에 붙여넣을 수 있습니다 kubectl 그것을 받아들일 것입니다.
YAML이 존재하는 이유는 아무도 이것을 하지 않습니다 인간 인체공학. Kubernetes 매니페스트, GitHub Actions 워크플로, Docker Compose 파일, Ansible 플레이북, Home Assistant 구성 - 사람들이 지속적으로 읽고 직접 편집하기 때문에 YAML입니다 replicas: 3 들여쓰기된 블록 아래에서는 스캔하는 것보다 낫습니다 {"replicas":3} 중첩 중괄호. 누군가가 "JSON 을 YAML 로 변환, "을 의미 합니다 블록 스타일 YAML: 중괄호 대신 들여쓰기, - 대괄호로 묶인 배열 대신 대시, 필요한 인용문이 없습니다.
그 마지막 절은 어려움이 사는 곳입니다. JSON's everything-explicit 구문에서 YAML's 최소 구문으로 가는 것은 모든 문자열에 대해 따옴표를 안전하게 잃을 수 있는지 여부를 결정합니다- 그리고 그 결정은 대부분의 인간이 금요일 오후 5 시에 안정적으로 수행하는 것보다 더 나은 YAML's 스칼라 해상도 규칙을 알아야 합니다. That's 변환기의 실제 작업; braces-to-indentation 부분은 사소한 것입니다.
손으로 개종하면 조용히 깨지는 것은 무엇입니까?
실패 사례는 4 개의 가족으로 떨어지고,I've 는 진짜 윤곽에 있는 그들의 각자를 명중했다:
부울 유사. YAML 1.1이 해결됩니다 yes, no, on, off, y, n (다양한 케이싱에서) 부울로 유지되며 YAML 1.2가 유지됩니다 true/false. PyYAML - 여전히 대부분의 파이썬 코드베이스에서 기본 YAML 라이브러리 - 1.1 을 구현합니다. 그래서 "debug": "no" 손으로 변환했습니다 debug: no 된다 debug: false 파이썬 배포 툴링에서. 노르웨이 문제 (NO → false)와 그 사촌 온타리오 문제(Ontario problem)ON → true) 이 family's 최고 히트작입니다.
숫자 닮은꼴. "port": "3000" 로 변환 port: 3000 는 이제 정수입니다. Kubernetes doesn't 는 일부 필드에서는 신경을 쓰고 다른 필드에서는 hard-fails - env var 값은 예를 들어 문자열이어야 합니다 kubectl apply 필드 이름을 지정하지만 필드 이름은 지정하지 않는 오류가 있는 정수를 거부합니다 왜. 버전 문자열은 실패하는 것이 없기 때문에 더 나쁩니다: version: 1.10 플로트로 구문 분석합니다 1.1그리고 배포 스크립트는 잘못된 버전을 영원히 행복하게 보고합니다. 선행 0 - 우편번호, 전화번호, 8진수처럼 보이는 ID 0755- 가족을 마무리하세요.
특수 문자. 인용되지 않은 값 내부에 콜론 뒤에 공백이 오면 매핑이 시작됩니다(message: error: not found 는 구문 분석 오류 또는 중첩 맵이며 구문 분석기에 따라 다름). A # 중간 값의 댓글을 시작합니다. 선도 *, &, ! yaml's 앵커,별칭, 태그 구문과 충돌합니다. 개행 문자가 있는 문자열은 이스케이프 또는 스칼라 차단이 필요합니다.
빈 문자열. YAML의 인용되지 않은 공허함은 다음과 같습니다 null, 아니다 "". 빈 문자열을 들고 있는 JSON 필드는 인용되어 나와야 하며 그렇지 않으면 유형이 변경됩니다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 변환기 네 가지 가족 모두에 대해 모든 문자열을 확인하고 필요한 문자열만 인용합니다. production it's undambiguous; 때문에 맨손으로 나옵니다 "3000", "no", "1.10", 그리고 "" 그들이 aren't. There's 또한 a "모든 문자열을 인용"에 대한 토글 때 you're feeding a parser you don't 신뢰하고 전혀 제로 스칼라 해상도가 발생하기를 원합니다.
도구를 사용하여 JSON을 YAML로 어떻게 변환합니까?
1 단계: JSON 붙여넣기
유효한 JSON 작업 - 개체, 배열, 깊은 중첩, 유니코드. 샘플 불러오기 버튼은 흥미로운 경우를 연습하는 현실적인 서비스 구성을 제공합니다: 숫자 문자열 포트,부울, 빈 배열,중첩된 맵. 입력에 구문 문제가 있는 경우 변환기는 잘린 문서를 변환하는 대신 parser's 정확한 오류를 보고합니다; 사냥을 위해 어디 오류는 큰 덩어리에 있습니다 JSON 포맷터 는 더 나은 현미경.
2 단계: 들여쓰기를 선택합니다
두 칸 또는 네 칸. 두 개는 압도적인 규칙입니다 - Kubernetes docs,GitHub Actions 예제,Docker Compose 참조,그리고 yamllint 기본값은 모두 그것을 사용 합니다-하지만 일부 팀은 깊은 중첩에서 가독성을 위해 4 에 표준화 합니다. 당신이 선택 하는 것,변환기는 키 아래 목록 항목의 미묘한 경우를 포함 하 여 그것에 대해 일관성이,여기서 일관 되지 않은 손 들여쓰기는 "mapping 값의 고전적인 소스입니다 here" 오류.
3 단계: 변환 및 검토
출력은 선과 바이트 조사로 나타납니다. 그것을 한 번 훑어보십시오 - 정확성을 위해 (that's the converter's job) 그러나 당신의 기대에 반하는 인용 결정을 온전하게 확인하기 위하여 아닙니다 PORT: "3000" 동안 인용 NODE_ENV: production isn't 는 어떤 값이 위험했는지 알려주는 도구입니다.
4 단계: 복사 또는 다운로드
기존 매니페스트에 붙여넣기 위해 클립보드로 복사하거나 다음과 같이 다운로드하세요 .yaml 파일. 출력은 공백만 사용합니다 - YAML 은 들여쓰기를 위해 탭을 금지합니다. 이는 나중에 탭 들여쓰기를 위해 구성된 편집기에서 파일을 편집할 때 알 가치가 있습니다.
JSON 대 YAML: 각 형식은 언제 승리합니까?
| JSON | 얌 | |
|---|---|---|
| 에 의해 읽기/편집됨 | 기계, API | 인간, 작전팀 |
| 코멘트 | 스펙에 없습니다 | # 댓글 - 구성의 킬러 기능입니다 |
| 유형 명시성 | 총계 - 견적이 모든 것을 결정합니다 | 스칼라 해상도 - 컨텍스트가 결정합니다 |
| 다중선 현 | \n 탈출만 가능합니다 |
스칼라 차단(` |
| 파싱 속도 & amp; 유비쿼터스 | 가장 빠른, 모든 곳에서 | 더 느리고 무거운 파서 |
| 족총 | 후행 쉼표, that's about it | 노르웨이 문제, 탭, 들여쓰기 드리프트, 버전 잘림 |
| 자연 서식지 | API 페이로드, package.json, 데이터 교환 |
쿠버네티스, CI 파이프라인, 컴포즈, 앤서블 |
테이블 뒤에 패턴: JSON은 기계가 쓰고 기계가 읽는 곳마다 승리합니다; YAML은 기계가 읽는 곳마다 승리하지만 a 인간 씁니다. 구성은 JSON-to-YAML 방향이 일반적인 것인 이유인 두 번째 범주에 정면으로 자리잡고 있습니다. 데이터는 API 또는 데이터베이스 내보내기에서 수명을 시작하고 ops 팀이 유지할 수 있는 것이 되어야 합니다. 역방향 여행인 YAML은 기계 판독 가능 JSON으로 돌아갑니다 야엘 검증인 핸들 - YAML을 붙여넣고 유효성 검사와 이에 상응하는 JSON을 받으세요.
이 변환을 위한 일상적인 워크플로는 무엇입니까?
API 출력에서 쿠버네티스 매니페스트
kubectl get deployment my-app -o json JSON 을 제공합니다; Git 에 체크하는 매니페스트는 YAML 입니다. API 응답을 클린 YAML 로 변환하는 것은 라이브 리소스에서 매니페스트를 부트스트랩하는 가장 빠른 방법입니다 - 변환,서버가 채워진 것을 제거하십시오 status 그리고 metadata.managedFields 블록, 그리고 선언적 시작점이 있습니다. 타입-세이프 따옴표는 keep here: env 값을 쿠버네티스 안에서 얻습니다 반드시 be 문자열, 그리고 변환기's 인용에 대한 고집 "3000" 의 차이입니다 kubectl apply 성공하고 실패하는 것.
CI 파이프라인 구성
GitHub Actions 와 GitLab CI 는 YAML 전용입니다. I'm 이 프로그래밍 방식으로 워크플로우 단계를 생성할 때 - WP Adminify against 테스트를 위한 PHP 및 Node 버전의 매트릭스,예를 들어 - 생성기는 자연스럽게 JSON 을 생성하며,마지막 단계는 변환입니다. 테스트 매트릭스의 버전 문자열은 순진한 변환으로 망가지는 값과 정확히 일치합니다: 의 매트릭스 ["1.9", "1.10", "1.11"] PHP에 대한 견적 테스트 없이 손으로 변환됩니다 1.1 두번. 그만큼 코딩 도구 모음 이 생성 후 변환 패턴을 더 많이 다룹니다.
Docker는 Inspect Output으로 구성합니다
docker inspect Json을 방출합니다; docker-compose.yml YAML 을 원합니다. 실행 중인 컨테이너 - 포트,볼륨, env - 에서 Compose 파일을 역설계하는 것은 변환 및 가지치기 작업입니다. 빈 배열 및 개체는 다음으로 변환됩니다 [] 그리고 {} compose가 수용하고 가지치기 단계를 읽을 수 있도록 유지하는 흐름 구문입니다.
구성을 검토할 수 있게 만들기
이 하나는 과소 평가: JSON 수십 중첩 키 구성이 부분적으로 그들은 can't 코멘트를 수행 하기 때문에 코드 검토에서 비참 한. YAML 로 변환 하면 주석을 달 수 있습니다 왜 rateLimit 는 값 바로 옆에 있는 250 입니다. 리뷰 자체의 경우 변환을 a 와 페어링합니다 구조적 차이 JSON 이전/이후 의 "what actually changed" YAML 버전이 "why."를 처리하는 동안 정직한 질문
OpenAPI 및 스키마 문서
OpenAPI 사양은 일반적으로 YAML에서 작성되지만 JSON으로 생성 및 제공됩니다. 생성된 사양을 인간 편집을 위해 YAML로 변환한 다음 왕복 여행을 검증하는 것이 표준 API 팀 워크플로이며 충실도 보장(키 순서 보존, 유형 인용)은 YAML 버전이 JSON 조상에 대해 난이도를 유지한다는 것을 의미합니다.
키 오더 보존이 중요한 이유는 무엇입니까?
JSON 사양에 따르면 개체 키 순서는 의미가 없습니다 {"a":1,"b":2} 그리고 {"b":2,"a":1} 는 동일한 객체입니다. 따라서 변환기는 키를 알파벳순으로 정렬하고 기술적으로 정확할 수 있습니다. 또한 구성 파일이 있기 때문에 실질적으로 적대적일 수도 있습니다 읽다 순서대로: 쿠버네티스 배포는 자연스럽게 다음과 같이 읽습니다 apiVersion, kind, metadata, spec- 알파벳순으로 정렬하면 동일하게 구문 분석되고 몸값 메모처럼 읽히는 매니페스트가 생성됩니다.
변환기는 소스 순서로 키를 방출합니다. 문서의 정신 모델은 변환에서 살아남고 YAML 은 동일한 소스의 이전 변환 및 기존 순서 (값 앞의 이름, apiVersion 첫째, 관습을 유지하십시오. 당신이 만약 원하는 비교 목적을 위한 표준 순서, that's a diff-tool concern - the JSON 디프체커 순서에 관계없이 키별로 비교하며, 이는 해당 문제에 적합한 레이어입니다.
비밀이 포함된 구성을 변환하는 것이 안전한가요?
구성은 개발자가 처리하는 가장 비밀스러운 텍스트입니다. 암호가 포함된 데이터베이스 URL,env 블록의 API 토큰,인프라를 매핑하는 내부 호스트 이름입니다. It's 또한 사람들이 온라인 변환기에 붙여넣는 것과 정확히 일치하며 일반적으로 배포 도중에 일반적으로 서둘러 수행됩니다.
X-1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X 1000 X Toolz.dev 변환기 브라우저에서 완전히 실행: 구문 분석,스칼라 분석,직렬화 - 모든 것은 클라이언트 측 자바 스크립트이며,네트워크 요청이 데이터를 전달하지 않으며,도구는 연결 컷으로 계속 작동합니다. That's an architecture fact,not a privacy-policy promise. 전체 도구 상자 뒤에있는 브라우저 우선 디자인 철학은 에 배치됩니다 웹 개발자 툴킷 가이드; 이 도구는 워크플로에서 가장 민감한 단일 문서 유형에 적용되는 철학입니다.
분명한 주의 사항은 다음과 같습니다: 클라이언트 측 변환은 다음을 보호합니다 변환당신이 산출을 후에 풀칠하는 곳에. 그것의 자신의 안전 결정이다.
자주 묻는 질문
JSON을 온라인으로 YAML로 변환하려면 어떻게 해야 합니까?
JSON을 붙여넣으세요 JSON-YAML 변환기2 칸 또는 4 칸 들여쓰기를 선택하고 변환을 클릭합니다. 형식 안전 인용이 가능한 블록 스타일 YAML 을 얻고.yaml 파일로 복사하거나 다운로드할 준비가 됩니다. 변환은 브라우저에서 완전히 실행됩니다 - 아무것도 업로드되지 않습니다.
JSON 은 이미 유효한 YAML 입니까?
기술적으로 예 - YAML 1,2 는 JSON 의 상위 집합이므로 유효한 JSON 문서는 YAML 로 구문 분석됩니다. 그러나 JSON 구문은 YAML's 가독성 목적을 무효화합니다. 변환은 중괄호 대신 들여쓰기가 있는 블록 스타일 YAML 을 생성하며,이는 Kubernetes 매니페스트,CI 워크플로 및 Compose 파일이 사람이 읽고 편집할 것으로 기대합니다.
YAML의 노르웨이 문제는 무엇입니까?
PyYAML과 같은 파서가 여전히 적용되는 YAML 1.1 스칼라 규칙에 따라 인용되지 않은 값 no, yes, on, off는 부울로 구문 분석됩니다. 따라서 국가 코드 NO는 자동으로 거짓이 됩니다. 변환기는 YAML 파서가 부울, 숫자 또는 null로 해석할 수 있는 문자열을 자동으로 인용하여 이를 방지합니다.
숫자 문자열은 "3000" 변환 후 문자열을 유지합니까?
예. 변환기는 숫자처럼 보이는 문자열을 감지하고 출력에서 이를 인용하므로 "3000"는 정수 3000이 되는 대신 문자열로 유지됩니다. 이는 포트, "1.10"(그렇지 않으면 float 1.1로 잘림), 우편번호 및 앞에 0이 있는 ID에 중요합니다.
변환기가 내 JSON 키의 순서를 유지합니까?
예. 키는 소스 JSON 에 나타나는 순서대로 방출됩니다. 키를 정렬하는 것은 기술적으로 유효할 것입니다 - JSON 개체 순서는 당 아무런 의미를 지니지 않습니다 RFC 8259- 그러나 소스 순서는 기존 구조에서 구성을 읽을 수 있도록 유지하고 YAML을 JSON 소스에 대해 확산 가능하게 유지합니다.
출력을 Kubernetes 또는 Docker Compose 에서 직접 사용할 수 있습니까?
예. 출력은 공백 (절대 탭이 아님) 으로 들여쓰기된 표준 블록 스타일 YAML 이며,kubectl, Docker Compose,GitHub Actions,GitLab CI 가 모두 수용합니다. 문자열이어야 하는 값 - Kubernetes env var 값처럼 - 이 인용되어 나오며,인용되지 않은 숫자에서 kubectl 이 발생시키는 유형 오류를 피합니다.
YAML 을 JSON 으로 다시 변환하려면 어떻게 해야 하나요?
를 이용하세요 야엘 검증인 Toolz.dev 에서 - YAML 을 구문 분석하고,모든 구문 오류를보고하고,동등한 JSON 을 출력합니다. JSON to YAML Converter 와 함께 두 형식 간의 전체 왕복 여행을 제공합니다.
비밀이 포함된 구성 파일을 변환하는 것이 안전한가요?
예. 변환은 브라우저에서 전적으로 JavaScript 로 실행됩니다. - 네트워크 요청이 데이터를 전달하지 않으며,아무것도 저장되거나 기록되지 않으며,도구가 오프라인으로 작동합니다. 데이터베이스 자격 증명,API 토큰 또는 내부 호스트 이름으로 구성된 구성은 머신을 떠나지 않습니다.
YAML's 가독성은 진짜이고,그것의 날카로운 가장자리도 그렇습니다 - 체재는 문맥에서 유형을 해결하고,문맥은 정확하게 무슨 손 변환이 틀리는지 입니다. scalar 규칙을 알고 있는 변환기는 침묵하는 유형 손상 없이 당신에게 읽기 쉬운 윤곽을 줍니다: JSON을 변환하세요, 선택한 인용문을 훑어보고 노르웨이가 아직 국가인 곳에 적하목록을 발송합니다.



