개발자 도구 · 구문 변환기
YAML 기능은 JSON 변환에서 손실됩니다: 주석, 앵커 및 태그
· 작동 방식
YAML JSON 데이터 형식
YAML에는 주석, 앵커, 별칭, 병합 키, 태그 및 다중 문서 스트림이 있습니다. JSON에는 해당 항목이 없습니다. 이 게시물에서는 변환기가 각각의 작업을 수행하고 왜 다시 변환해도 원본 파일이 복원되지 않는지 설명합니다.
파일이 단 하나의 설명도 없이 더 오래 반환되었습니다. YAML 구성이 JSON로 변환된 후 그 반대로 변환되었으며, 살아남지 못한 모든 것
YAML 파일은 모든 댓글이 사라진 후에도 JSON에서 더 오랫동안 반환될 수 있습니다. 하나의 매핑을 공유하는 앵커는 반복되는 개체 데이터로 확인되므로 직렬 변환기는 각 복사본을 독립적으로 작성합니다. 값은 여전히 일치할 수 있지만 작성 구조와 설명은 사라졌습니다.
그렇기 때문에 YAML에서 JSON에서 YAML로의 왕복은 소스 보존이 아닌 데이터 변환으로 판단되어야 합니다. ToolAcre는 제한된 값 그래프를 읽고 새 문서를 작성합니다. 주석, 앵커 이름, 인용 선택 또는 블록 스칼라 표현을 포함하는 구체적인 구문 트리를 유지하지 않습니다.
댓글 — JSON에 댓글을 넣을 자리가 없고 변환 후 #줄이 모두 사라지는 이유
JSON에 주석 노드가 없기 때문에 YAML 구문 분석기에 의해 주석이 삭제됩니다. `#`로 시작하는 줄은 시간 초과가 존재하는 이유나 서비스 소유자를 설명할 수 있습니다. 일단 제거되면 어떤 알고리즘도 문구나 배치를 추론할 수 없습니다. 다시 변환하면 해당 운영 컨텍스트 없이 유효한 YAML이 생성됩니다.
원본 파일을 버전 관리에 보존하고 교체하기 전에 차이점을 검토하세요. 목표가 확인된 값을 검사하는 것이라면 JSON이 유용합니다. 설명을 유지하면서 형식을 다시 지정하는 것이 목표라면 이 일반 값 변환기는 잘못된 표현입니다.
앵커 및 별칭 — 반복 복사본으로 확장된 &default 및 *default 및 결과적으로 파일이 커지는 방식
앵커와 별칭은 안전 한도 내에서 허용된 후 확인됩니다. `base: &b {x: 1}` 및 `copy: *b`은 `x: 1`를 포함하는 두 개의 개체 경로가 됩니다. 출력 YAML은 `noRefs`을 사용하므로 공유 객체 ID는 새 앵커를 생성하지 않습니다. 반복되는 값이 살아남아도 밀집된 관계는 사라진다.
순환 별칭은 JSON이 주기를 표현할 수 없기 때문에 거부됩니다. 별칭 확장은 별칭 수, 중첩 및 확장된 노드 측정으로 제한됩니다. 백만 개가 넘는 값으로 문자열화되는 짧은 문서는 중지됩니다. 이는 임의의 YAML 지원을 주장하지 않고 탭을 보호합니다.
병합 키 — YAML 1.1의 <<: 규칙, 이를 지원하는 파서가 병합된 매핑을 평면화하는 방법 및 그렇지 않은 파서에서 발생하는 현상
개요에서는 YAML 1.1 병합 키가 평면화되었다고 가정합니다. ToolAcre는 js-yaml의 JSON 또는 Core 스키마만 로드하며 둘 다 병합 유형을 활성화하지 않습니다. 이러한 스키마에서 `<<` 키는 매핑 병합 명령이 아닌 일반 데이터입니다. 따라서 평면화된 병합을 배송된 동작으로 제시하는 것은 거짓입니다.
소스가 병합 키 의미 체계에 의존하는 경우 해당 규칙을 소유하는 애플리케이션에서 이를 해결하거나 변환 전에 명시적으로 값을 다시 작성하십시오. 일반 `<<`의 값으로 사용되는 별칭은 여전히 개체로 확인될 수 있지만 키는 `<<`로 유지됩니다. 이는 해당 멤버를 상위 멤버에 병합하는 것과 동일하지 않습니다.
이 변환기가 제공하는 두 가지 제한된 스키마에서는 병합 키가 활성화되지 않습니다.
제한된 스키마로 인식되는 표준 명시적 태그는 `!!str` 또는 `!!int`과 같은 기본 유형을 선택할 수 있습니다. 바이너리, 타임스탬프, 세트, 정렬된 맵, JavaScript 함수 및 Python 개체 생성자를 포함한 사용자 정의 및 다양한 태그는 거부됩니다. 문자열화되지 않으며 실행되지도 않습니다.
`---`로 구분된 YAML 스트림이 허용됩니다. 하나의 문서가 하나의 값이 됩니다. 몇몇은 문서 수의 이름을 지정하는 경고와 함께 배열이 됩니다. 후행 구분 기호는 선택한 스키마에 따라 빈 최종 문서를 생성할 수 있습니다. 여기에는 스트림 모델이 있는 대상이 없으므로 배열은 선언된 규칙입니다.
안전하지 않은 태그는 거부됩니다. 다중 문서 스트림은 배열이 됩니다
재시도 및 시간 초과와 함께 `defaults: &d`을 사용하고 시간 초과를 설명하는 주석을 사용한 다음 `inherited: *d`과 함께 `service:`을 사용합니다. JSON에는 기본값과 반복 상속된 개체가 모두 포함되어 있습니다. 댓글과 앵커 이름이 없습니다. 해당 JSON을 다시 변환하면 앵커 관계가 아닌 두 개의 매핑이 생성됩니다.
`---` 다음에 다른 문서를 추가하면 JSON 루트가 문서 배열이 됩니다. `!!binary`를 추가하면 제한된 스키마 힌트로 변환이 중지됩니다. 이러한 세 가지 변경 사항은 해결된 지원 데이터, 구조적 규칙 및 완전히 지원되지 않는 구성을 구별합니다.
여기서 다루지 않는 내용 — 일반적으로 유지되지만 두 형식 모두 보장되지 않는 키 순서 및 인용 스타일
일반적인 객체 삽입 순서는 종종 눈에 띄게 남아 있지만 소스 스타일 보존이 아니며 정렬 키를 선택하면 의도적으로 변경됩니다. 인용문, 흐름 대 블록 스타일, 스칼라 철자법 및 주석은 유지되지 않습니다. 중복 매핑 키는 잘못된 항목을 모두 유지하는 대신 경고와 함께 마지막 값을 유지합니다.
작성자는 YAML 1.1 소비자가 잘못 읽을 수 있는 값을 인용하여 모호한 문자열을 보호하지만 해당 안전 선택은 작성자의 원래 스타일과 다를 수 있습니다. 데이터 동등성은 일반적인 JSON 모양 값에 대한 방어 가능한 테스트입니다. 텍스트 평등은 그렇지 않습니다.
키 순서는 유지될 수 있지만 주석, 앵커, 태그 철자 및 스타일은 유지되지 않습니다.
YAML-to-JSON은 의미가 JSON 모양 값(주석, 별칭, 지원되지 않는 태그, 스트림 경계 등) 외부에 존재할 때마다 손실이 발생합니다. ToolAcre는 여러 가지 손실을 가시화하고 위험하거나 순환적인 구성을 보존하는 척하기보다는 거부합니다.
워크플로를 채택하기 전에 대표 파일을 변환합니다. 경고를 검사하고, 해결된 값의 차이를 확인하고, 작성된 YAML를 유지하세요. 패널은 파서가 보는 것에 대한 훌륭한 렌즈이지만 주석 보존 편집기나 완전한 YAML 개체 모델 변환기는 아닙니다.
마이그레이션 검토의 경우 값 변경 사항과 소스 전용 변경 사항을 분리하세요. JSON 심층 비교를 통해 일반 값이 살아남았는지 여부를 확인할 수 있으며, 텍스트 비교를 통해 필연적으로 변경된 주석, 앵커 및 스타일을 확인할 수 있습니다. 두 수표 모두 다른 수표를 대체하지 않습니다. 값 비교를 무손실로 호출하면 소스 정보가 무시됩니다. 모든 텍스트 변경 사항을 호출하면 데이터 오류가 발생하면 유효한 재직렬화가 무시됩니다.