Tiếng Việt

Công cụ dành cho nhà phát triển · Trình chuyển đổi cú pháp

JSON có hợp lệ YAML không? YAML 1.2 hứa hẹn những gì và nó bị hỏng ở đâu

· Lý lịch

json yaml data-formats

Tài liệu JSON vừa khít bên trong khung kiểu luồng YAML với các tính năng chỉ YAML bên ngoài
Hình minh họa vector ToolAcre gốc

YAML 1.2 được thiết kế sao cho mọi tài liệu JSON cũng là tài liệu YAML, đó là lý do tại sao việc chuyển đổi JSON sang YAML có vẻ tầm thường. Bài đăng này giải thích những gì đặc tả thực sự đảm bảo và các trường hợp khó khăn khi lời hứa không thành công.

Dán JSON vào tệp YAML và xử lý nó - tại sao cách đó hiệu quả và có lần nó không hiệu quả

Một đối tượng JSON thông thường có thể được dán vào phía nguồn YAML và đọc theo lược đồ YAML 1.2 JSON của ToolAcre. Dấu ngoặc nhọn, dấu ngoặc đơn, khóa trích dẫn, chuỗi, số, boolean và null trở thành cùng một giá trị JavaScript đơn giản. Điều đó giải thích tại sao ranh giới thường có vẻ tầm thường.

Sự đảm bảo phải vẫn dành riêng cho trình phân tích cú pháp. ToolAcre hạn chế thẻ, viết hoa bí danh và lồng ghép, đồng thời áp dụng giới hạn đầu vào. Một văn bản có thể hợp lệ trong bộ xử lý YAML rộng hơn nhưng lại bị từ chối ở đây vì lý do an toàn hoặc hình dạng không liên quan đến lõi trông có vẻ JSON của nó.

JSON thông thường tải qua trình đọc YAML 1.2 này; tiện ích mở rộng không được hỗ trợ không thành công vì những lý do riêng biệt

Các lược đồ đã chọn tạo ra các giá trị có hình dạng JSON: chuỗi, số, boolean, null, mảng và ánh xạ. Sự căn chỉnh này cho phép phân tích cú pháp rồi tuần tự hóa thay vì thay thế dấu câu. Mã nguồn không thiết lập mọi từ ngữ hoặc lỗi sai của đặc tả YAML, vì vậy bài viết báo cáo hành vi đã được kiểm tra thay vì tuyên bố tuân thủ đầy đủ.

Trong chế độ nghiêm ngặt, dấu ngã, giá trị trống và chuỗi `0o755` giữ nguyên. Đó là YAML mã thông báo JSON bản thân nó sẽ không chứa. Core giải quyết chúng theo cách khác nhau trong khi vẫn trả về đầu ra có hình JSON.

Các lược đồ được vận chuyển căn chỉnh với dữ liệu có hình JSON mà không chứng minh mọi khía cạnh đặc tả

Các khóa ánh xạ YAML trùng lặp giữ giá trị cuối cùng kèm theo cảnh báo; một cách giải thích chặt chẽ ở nơi khác có thể bác bỏ chúng. YAML 1.1 kế thừa có thể nhập các từ như `NO` theo cách khác, trong khi trình đọc này giữ chúng dưới dạng chuỗi. Những khác biệt đó làm phức tạp thêm các tuyên bố về tính di động rộng rãi.

Các tab được sử dụng làm thụt lề sẽ gây ra lỗi, trong khi các tab bên trong chuỗi JSON được trích dẫn sẽ bị thoát. Các giá trị quá sâu hoặc quá lớn có thể chạm tới giới hạn an toàn cục bộ. Mối quan hệ ngôn ngữ lý thuyết không ghi đè lên ranh giới thực hiện.

Các khóa trùng lặp và sự khác biệt của trình phân tích cú pháp kế thừa vẫn là ranh giới về khả năng tương tác

Điều ngược lại rõ ràng là sai đối với đường dẫn giá trị này. YAML nhận xét không có đại diện JSON, bí danh phân giải thành dữ liệu lặp lại, luồng nhiều tài liệu trở thành mảng và thẻ không được hỗ trợ bị từ chối. Khối vô hướng trở thành chuỗi nhưng phần trình bày của chúng bị mất.

Do đó, ngay cả tài liệu YAML được hỗ trợ cũng có thể chuyển đổi thành JSON hợp lệ và không bao giờ quay lại cùng một văn bản YAML. Sự bình đẳng dữ liệu có thể tồn tại đối với các giá trị thông thường trong khi nhận xét, neo, chính tả và nhận dạng luồng thì không.

Điều này có ý nghĩa gì đối với việc chuyển đổi — JSON thành YAML là thay đổi về kiểu, YAML thành JSON là bản dịch có thể làm mất thông tin

JSON-to-YAML thường là thay đổi về kiểu và tuần tự hóa cho đầu vào có hình JSON. YAML-to-JSON trước tiên diễn giải cú pháp cụ thể của YAML, sau đó chiếu kết quả vào mô hình giá trị nhỏ hơn của JSON. Các hướng không đối xứng.

ToolAcre kiểm tra các tài liệu JSON-to-YAML-to-JSON thông thường chứa các giá trị lồng nhau, Unicode, null, mảng và các chuỗi có vẻ mơ hồ. Những thiết bị cố định đó chứng minh lớp dữ liệu được đề cập, không phải mọi cặp bộ xử lý JSON hoặc YAML có thể có.

Ví dụ đã hoạt động: một tài liệu JSON được tải dưới dạng YAML — có cùng cấu trúc, sau đó một tính năng chỉ YAML được thêm vào để hiển thị vị trí dừng công cụ JSON

Dán `{"country":"NO","items":[1,null],"nested":{"ok":true}}` làm dữ liệu nhập YAML. Người đọc nghiêm ngặt trả về cùng một cây. Thêm nhận xét YAML và giá trị vẫn giữ nguyên cho đến khi nhận xét biến mất. Thay thế một đối tượng lặp lại bằng một mỏ neo và bí danh; JSON hiện chứa các bản sao thay vì cú pháp tham chiếu.

Thêm `---` và tài liệu thứ hai; kết quả trở thành một mảng tài liệu kèm theo cảnh báo. Thêm `!!binary`; người đọc bị hạn chế từ chối nó. Mỗi bước đánh dấu một ranh giới riêng biệt: bản trình bày bị bỏ qua, cấu trúc đã giải quyết, quy ước luồng và loại không được hỗ trợ.

Điều này không đề cập đến — khả năng tương thích ở cấp lược đồ, trong đó các loại YAML như dấu thời gian không có đối tác JSON

Khả năng tương thích của lược đồ không chỉ là về cú pháp bề mặt. Core có thể tạo Infinity hoặc NaN, mà JSON ghi là null kèm theo cảnh báo. Thẻ thời gian và thẻ nhị phân bị từ chối theo các lược đồ bị hạn chế thay vì được chuyển đổi. ToolAcre cố tình thu hẹp YAML thành dữ liệu có hình dạng JSON an toàn.

Việc triển khai YAML khác có thể hỗ trợ các loại bổ sung. Điều đó làm cho nó ít tương thích hơn với các giá trị JSON đơn giản ở những điểm đó, không tự động tốt hơn hay kém hơn. Chọn dựa trên hợp đồng mục tiêu và yêu cầu bảo mật.

Khả năng tương thích ở cấp độ lược đồ bao gồm các giá trị không hữu hạn và thẻ tạm thời mà trình đọc bị hạn chế này giới hạn hoặc từ chối

Dữ liệu có hình dạng JSON thông thường được truyền một cách rõ ràng qua trình đọc và trình ghi YAML 1.2 này. Các tuyên bố rộng hơn về tất cả các tài liệu hoặc trình phân tích cú pháp yêu cầu các nội dung cố định bao gồm các khóa, phiên bản lược đồ, thẻ và giới hạn tài nguyên trùng lặp.

Sử dụng trình chuyển đổi Cú pháp để kiểm tra văn bản thực tế và đọc các cảnh báo của nó. Chỉ coi “JSON là YAML” là cách viết tắt hữu ích sau khi đặt tên cho trình phân tích cú pháp, lược đồ và các tính năng không được hỗ trợ giúp tạo ra ranh giới thực sự chính xác.

Để kiểm tra tính di động, hãy giữ một thiết bị cố định hoàn toàn bên trong mô hình giá trị của JSON và một thiết bị cố định khác bổ sung một tính năng chỉ YAML tại một thời điểm. Chạy cả hai thông qua từng người tiêu dùng dự định. Phương pháp đầu tiên đo lường yêu cầu tập hợp con thực tế; thứ hai xác định chính xác nơi nhận xét, bí danh, luồng, thẻ hoặc quy tắc vô hướng phân kỳ. Phương pháp dàn dựng này mang lại nhiều thông tin hơn so với việc hỏi liệu hai ngôn ngữ có phải là tập hợp con trong bản tóm tắt hay không, bởi vì nó tạo ra các lỗi liên quan đến các trình phân tích cú pháp mà hệ thống của bạn thực sự sử dụng.