Chuyển đổi JSON ↔ YAML là gì?
JSON (JavaScript Object Notation, RFC 8259) là định dạng văn bản nghiêm ngặt phân định bằng dấu ngoặc nhọn cho dữ liệu có cấu trúc; YAML (YAML Ain't Markup Language, phiên bản 1.2) là một tập cha của JSON sử dụng thụt lề, ngắt dòng và cú pháp dễ đọc cho cùng một mô hình giá trị. Việc chuyển đổi giữa chúng cho phép bạn xoay cùng một cấu hình giữa dạng thân thiện với máy (JSON cho API, kiểm tra schema, biến đổi bằng chương trình) và dạng thân thiện với con người (YAML cho code review, Kubernetes manifests, GitHub Actions workflows) mà không cần gõ lại một khóa nào.
Chuyển đổi JSON ↔ YAML hoạt động như thế nào?
Mọi lần chuyển đổi đều chạy cục bộ trong trình duyệt của bạn bằng thư viện js-yaml đi kèm (MIT, phiên bản 4.1.0). Các bước ở mức cao là:
- Bộ chọn chế độ (Tự nhận diện / JSON → YAML / YAML → JSON) quyết định pipeline nào sẽ chạy. Ở chế độ Tự nhận diện, ký tự không phải khoảng trắng đầu tiên của đầu vào sẽ chọn hướng —
{hoặc[nghĩa là JSON; mọi thứ khác nghĩa là YAML. - JSON → YAML:
JSON.parsexác thực đầu vào và tạo một giá trị JavaScript;jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false })viết dạng YAML 1.2. Khi Đa tài liệu bật, một mảng đầu vào được dump mỗi phần tử một tài liệu và nối bằng dấu phân cách---. - YAML → JSON:
jsyaml.loadAllphân tích mọi tài liệu trong đầu vào (tự động xử lý dấu phân cách---) thành một mảng; các đầu vào đơn tài liệu được mở gói để kết quả JSON là chính tài liệu, không phải mảng một phần tử. - Thụt lề (2 hoặc 4 khoảng trắng) và In đẹp đều có thể cấu hình. Tắt In đẹp sẽ phát ra JSON rút gọn qua
JSON.stringify(value)không có khoảng trắng nào. - Kết quả được ghi vào vùng văn bản chỉ đọc. Khi phân tích YAML thất bại, thông báo lỗi bao gồm số dòng và cột bắt đầu từ 1 do
e.markcủajs-yamlbáo cáo để bạn nhảy thẳng tới chỗ lỗi.
Vì sao chuyển đổi JSON và YAML bằng công cụ này?
- Quyền riêng tư: mọi lần phân tích, biến đổi và phát ra đều diễn ra trong trình duyệt của bạn. Dữ liệu — bao gồm Kubernetes secrets, JWT đã ký và config độc quyền — không bao giờ đến máy chủ của chúng tôi.
- YAML đa tài liệu:
jsyaml.loadAllnhận diện dấu phân cách---và trả về một mảng tài liệu mà bộ chuyển đổi mở gói cho trường hợp một tài liệu, hoặc giữ nguyên dưới dạng mảng JSON cho trường hợp nhiều tài liệu. - Phân giải anchor và alias: cơ chế
&anchor/*aliascủa YAML được xử lý bởi schema mặc định củajs-yaml. Một giá trị được định nghĩa một lần và tham chiếu hai lần round-trip thành một đối tượng JSON nơi tất cả các tham chiếu mang giá trị bằng nhau. - Không CDN, không telemetry: thư viện
js-yaml.min.jsđược phục vụ từ cùng origin với trang, nên công cụ hoạt động ngoại tuyến, sau proxy doanh nghiệp, và trong môi trường air-gapped.
Các ứng dụng phổ biến của chuyển đổi JSON ↔ YAML là gì?
Xoay giữa JSON và YAML xuất hiện trong DevOps, kỹ thuật nền tảng và tooling API:
- Kubernetes manifests: chuyển một YAML
Deployment,ConfigMaphoặcHelmReleasesang JSON để một policy validator nội bộ (Joi, Ajv, OPA Rego) có thể lint bằng chương trình, rồi quay lại YAML để apply cluster. - Workflow CI/CD: round-trip một
workflow.ymlcủa GitHub Actions qua JSON để code-generator có thể viết lại matrix hoặc phụ thuộc job, rồi phát ra YAML đã dọn dẹp cho PR. - Spec OpenAPI: dán một
openapi.jsonJSON từ docs tự sinh của backend và chuyển sangopenapi.yamlcho bản tham chiếu chỉnh tay được check vào repo.
Ví dụ round-trip JSON ↔ YAML trông như thế nào?
Dán {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}} rồi nhấn CONVERT ở chế độ JSON → YAML tạo ra tám dòng YAML có thụt lề với apiVersion: apps/v1 ở dòng đầu tiên. Đưa YAML đó trở lại ở chế độ YAML → JSON với In đẹp bật trả lại đối tượng gốc từng byte sau một JSON.stringify(value, null, 2) ổn định, với thứ tự khóa được giữ vì schema mặc định của js-yaml tôn trọng thứ tự chèn ở cả hai chiều.
Bộ chuyển đổi JSON ↔ YAML này có chạy hoàn toàn trong trình duyệt của tôi không?
Có. Mọi lần phân tích, biến đổi và phát ra đều chạy cục bộ dưới dạng JavaScript trong tab trình duyệt của bạn. Thư viện js-yaml đi kèm được phục vụ từ cùng origin với trang — không CDN, không fetch, không XMLHttpRequest, không navigator.sendBeacon trên đầu vào. Công cụ cũng hoạt động ngoại tuyến sau khi trang đã tải, vì đây là một gói HTML/CSS/JS tĩnh với thư viện vendor được copy bên cạnh. Kubernetes secrets, JWT payload, CloudFormation YAML đã ký và config độc quyền vẫn ở trên thiết bị của bạn.
Bộ chuyển đổi xử lý YAML đa tài liệu như thế nào?
YAML hỗ trợ nhiều tài liệu trong một luồng được phân tách bằng các dòng chỉ chứa ---. Ở YAML → JSON, bộ chuyển đổi gọi jsyaml.loadAll, trả về mọi tài liệu dưới dạng một giá trị JavaScript. Nếu tìm thấy đúng một tài liệu thì kết quả JSON là chính tài liệu đó; nếu tìm thấy hai hoặc nhiều hơn thì kết quả JSON là một mảng. Ở JSON → YAML, khi đầu vào là một mảng JSON VÀ công tắc Đa tài liệu bật, mỗi phần tử mảng được phát ra như tài liệu riêng với dấu phân cách --- ở giữa — hữu ích để tạo một bundle thân thiện với kubectl apply từ một mảng JSON các resource.
Anchor và alias YAML có được hỗ trợ không?
Có — các định nghĩa &anchor và tham chiếu *alias được phân giải bởi schema mặc định của js-yaml trong bước load. Một đầu vào YAML như defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d phân tích thành một đối tượng JSON nơi job_a và job_b đều chứa retries: 3, timeout: 30. Khóa merge << (một mở rộng YAML 1.1 mà js-yaml vẫn tôn trọng) cũng được hỗ trợ trên schema mặc định.
Các chú thích YAML có được giữ lại khi chuyển sang JSON và quay lại không?
Không — js-yaml bỏ chú thích trong bước phân tích, nên một round-trip YAML → JSON → YAML sẽ mất mọi dòng có tiền tố #. Đây là một giới hạn đã biết của mô hình load/dump; nếu việc bảo toàn chú thích là quan trọng, hãy dùng một thư viện nhận biết chú thích như gói npm yaml (cung cấp API CST + AST được thiết kế để bảo toàn trivia) thay vì js-yaml. Với hầu hết workflow chuyển đổi config, sự đánh đổi là chấp nhận được: YAML đã round-trip giữ mọi key, value, anchor và alias, chỉ thiếu các chú thích do con người viết.
Chuyện gì xảy ra với các thẻ YAML tùy chỉnh?
Bộ chuyển đổi dùng DEFAULT_SCHEMA của js-yaml, hiểu !!str, !!int, !!float, !!bool, !!null, !!seq, !!map, !!binary, và !!timestamp — mọi thẻ trong YAML 1.2 core và JSON schemas. Các thẻ tùy chỉnh hoặc đặc thù ứng dụng (ví dụ !Ref trong CloudFormation, !vault trong Ansible) không được nhận biết và xuất hiện dưới dạng một lỗi rõ ràng chỉ ra thẻ không được hỗ trợ. Riêng với CloudFormation, hãy dùng luồng aws cloudformation package + --output-template-file để mở rộng các thẻ tùy chỉnh trước khi dán vào bộ chuyển đổi này.
Bộ chuyển đổi JSON ↔ YAML này đi kèm js-yaml@4.1.0 được bundle ở cùng origin, hỗ trợ luồng đa tài liệu và anchor/alias ngay từ đầu, và báo cáo lỗi phân tích YAML với dòng và cột để bạn sửa nguồn. Không tải lên, không CDN, không telemetry — mọi byte đều ở trong trình duyệt của bạn.