Công cụ dành cho nhà phát triển · Trình chuyển đổi cú pháp
YAML đến JSON ép buộc gõ: có, không và 0777 thay đổi ý nghĩa như thế nào
· Cách thức hoạt động
yaml json data-formats
YAML phân giải các đại lượng vô hướng không được trích dẫn thành các loại và các quy tắc khác nhau giữa YAML 1.1 và 1.2. Bài đăng này cho thấy chính xác cách một trình chuyển đổi quyết định rằng một giá trị là boolean, số nguyên, float hoặc chuỗi và cách kiểm soát kết quả.
Giá trị trả về là đúng — một số vô hướng YAML đơn giản có nghĩa là văn bản, được chuyển đổi thành JSON dưới dạng boolean và dịch vụ sau đó hoạt động sai
Giá trị như `NO` có thể trở thành sai trong trình tải YAML 1.1 nhưng đó không phải là giá trị mà trình chuyển đổi này cung cấp. Cả hai lựa chọn ToolAcre đều sử dụng lược đồ YAML 1.2, vì vậy `NO`, `yes`, `no`, `on` và `off` vẫn là chuỗi. Phần mở đầu đã được sửa lại quan trọng vì một ví dụ tuyên bố rằng bảng này biến `NO` thành đúng hoặc sai sẽ dạy điều ngược lại với hành vi đã được thử nghiệm của nó.
Loại bất ngờ vẫn tồn tại. Trong lược đồ JSON mặc định, `null` là null trong khi `~`, một giá trị trống và `0o755` vẫn là chuỗi. Việc chọn Core sẽ thay đổi ba biểu mẫu đó thành null, null và 493. Đầu ra hữu ích một cách chính xác vì nó hiển thị giá trị JavaScript đã được giải quyết, thay vì giả vờ rằng mọi mã thông báo YAML đơn giản đều mang một loại rõ ràng.
Giá trị giữ nguyên văn bản trong YAML 1.2
Độ phân giải ngầm xảy ra trong khi js-yaml đọc nguồn. Lược đồ bị hạn chế đã chọn sẽ quyết định xem một đại lượng vô hướng đơn giản có khớp với dạng null, Boolean hay dạng số hay không trước khi trình chuyển đổi ghi JSON. Việc trích dẫn bỏ qua quyết định đó: `"0o755"` là văn bản trong một trong hai lược đồ và khối vô hướng vẫn là một chuỗi bao gồm các ngắt dòng được biểu thị bằng chỉ báo ngắt dòng của nó.
Đây là phân tích cú pháp và tuần tự hóa, không phải là sự thay thế biểu thức chính quy. Trình đọc xây dựng các chuỗi, số, boolean, null, mảng và đối tượng; `JSON.stringify` sau đó phát ra các giá trị đó với thụt lề đã chọn. Nhận xét và chính tả mã thông báo đã được loại bỏ ở giai đoạn viết, vì vậy không có trình tuần tự hóa nào có thể xây dựng lại liệu một số ban đầu là số thập phân hay được viết bằng ký hiệu YAML được chấp nhận khác.
Các quy tắc YAML 1.1 — có/no/on/off booleans, 0777 dưới dạng bát phân, 1:30 dưới dạng lục thập phân và các chuỗi phiên bản như 1.10 được đọc dưới dạng số thực
Phác thảo liệt kê YAML 1.1 các ràng buộc như thời gian lục thập phân và bát phân kế thừa. Chúng là những mối nguy hiểm liên quan đến khả năng tương thích nhưng chúng không phải là các chế độ có sẵn ở đây. ToolAcre cố tình không cung cấp lược đồ 1.1. Giao diện người dùng của nó cho biết rằng cả hai tùy chọn được giao đều không đọc `NO` là sai và kiểm tra ghim mã quốc gia đó cũng như các từ có, không, bật và tắt dưới dạng chuỗi.
Ranh giới đó thay đổi phương pháp gỡ lỗi. Nếu một ứng dụng khác biến những từ đó thành boolean, hãy so sánh cấu hình trình phân tích cú pháp của nó với ToolAcre thay vì mong đợi kết quả đầu ra giống hệt nhau. Trình chuyển đổi có thể hiển thị hai lược đồ của chính nó tạo ra những gì; nó không thể chứng nhận lược đồ hoặc phiên bản được sử dụng bởi trình chạy CI, khung hoặc hệ thống triển khai mà sau này sẽ sử dụng tệp.
YAML 1.1 sự ép buộc là những mối nguy hiểm mà trình chuyển đổi này tránh được
Lược đồ JSON mặc định chỉ chấp nhận cách viết vô hướng tương thích với mô hình của JSON. Core bổ sung các dạng null YAML quen thuộc, số nguyên thập lục phân và bát phân, Infinity và NaN. Lõi vẫn nằm trong một trình tải bị hạn chế: các thẻ đối tượng, ngày tháng, bộ, bản đồ được sắp xếp và thẻ nhị phân dành riêng cho ngôn ngữ bị từ chối thay vì được xây dựng.
Infinity và NaN tiết lộ một ranh giới khác. JavaScript có thể giữ chúng nhưng JSON không thể viết chúng. Trình chuyển đổi xác định từng đường dẫn và cảnh báo rằng giá trị sẽ trở thành null. Đó là một bước mất mát được thừa nhận, không phải là một chuyển đổi lossless. `.inf` được trích dẫn sẽ tránh nó vì giá trị khi đó vẫn giữ nguyên chuỗi ký tự `.inf`.
Hai lược đồ YAML 1.2 được gửi đi chỉ khác nhau về dạng vô hướng được ghi lại
Dán `tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` và `answer: yes`. Với mức chọn nghiêm ngặt, các giá trị JSON là `"~"`, `""`, `"0o755"`, `"NO"` và `"yes"`. Với Core được chọn, chỉ có ba thay đổi đầu tiên: dấu ngã và dấu trống trở thành rỗng và bát phân trở thành 493. Văn bản giữ nguyên quốc gia và câu trả lời ở cả hai đầu ra.
Bây giờ trích dẫn mọi giá trị và lặp lại. Cả hai lược đồ đều trả về chuỗi vì nguồn nêu rõ loại dự định. Sự so sánh này chính xác về mã và hữu ích hơn so với việc so sánh YAML 1.1 với 1.2 bên trong một công cụ không bao giờ tải 1.1. Nó cũng cung cấp một công cụ cố định có thể xem lại để kiểm tra một trình phân tích cú pháp khác mà không cần đoán từ tài liệu của nó.
Ví dụ đã hoạt động: một tệp trong các lược đồ cốt lõi và nghiêm ngặt của ToolAcre
Thẻ tiêu chuẩn rõ ràng chỉ được chấp nhận khi lược đồ bị hạn chế nhận ra chúng: `!!str 123` trở thành chuỗi `123`, trong khi `!!int "7"` trở thành số 7. Các thẻ như `!!binary`, `!!timestamp`, `!!set`, `!!js/function` và hàm tạo đối tượng Python đều bị từ chối. Điều này ngăn không cho trình đọc YAML trở thành một nhà máy sản xuất đối tượng tùy ý.
Trích dẫn vẫn là lựa chọn di động khi giá trị cấu hình chỉ được gõ. Nó bảo tồn các số 0 đứng đầu, chính tả phiên bản và các từ trọng điểm mà không phụ thuộc vào một thẻ rõ ràng còn sót lại bởi một công cụ khác. Kết quả JSON hiển thị loại đã chọn nhưng không thể mang kiểu trích dẫn hoặc thẻ đã tạo ra giá trị đó.
Điều này không bao gồm những gì - phân tích cú pháp cấp ứng dụng của JSON kết quả, có thể ép buộc lại các loại (ví dụ: chuỗi '1' thành số)
Mã ứng dụng có thể ép buộc lại JSON kết quả. API có thể đọc `"1"` và chuyển đổi nó thành một số hoặc từ chối nó theo một lược đồ. Trình chuyển đổi cú pháp dừng sau khi tạo văn bản JSON; nó không chạy trình xác thực khung, trình tải biến môi trường hoặc quy tắc kinh doanh. Do đó, một chuyển đổi rõ ràng chứng tỏ cú pháp và ánh xạ, không được dịch vụ cuối cùng chấp nhận.
Khóa YAML trùng lặp là một vấn đề riêng. ToolAcre giữ giá trị cuối cùng và báo cáo khóa lặp lại kèm theo một vị trí. Luồng nhiều tài liệu trở thành mảng. Những lựa chọn đó có thể thay đổi những gì ứng dụng nhìn thấy ngay cả khi mọi loại vô hướng đều được mong đợi, vì vậy hãy đọc các cảnh báo thay vì chỉ đánh giá nội dung JSON được định dạng.
Bài học rút ra: trích dẫn bất cứ điều gì máy có thể đọc sai — và cách chuyển đổi YAML thành JSON trong trình duyệt cho biết chính xác mỗi đại lượng vô hướng được giải quyết như thế nào
Văn bản trích dẫn giống với mã thông báo máy, sau đó kiểm tra các loại JSON. Sử dụng nghiêm ngặt khi bạn muốn từ vựng vô hướng có hình JSON nhỏ nhất; chọn Core một cách có chủ ý khi yêu cầu YAML null và dạng số. Cả hai tùy chọn đều không YAML 1.1 và cũng không buộc người tiêu dùng tiếp theo phải tuân theo các quy tắc tương tự.
Bảng điều khiển hiển thị lựa chọn trình phân tích cú pháp của nó và trả về cảnh báo cho các giá trị mà không mục tiêu nào có thể đại diện. Đó là lời hứa trung thực: nó tiết lộ cách triển khai này giải quyết từng vô hướng. Nó không yêu cầu hành vi YAML phổ biến hoặc lưu giữ các nhận xét, thẻ và chính tả trong suốt một lượt đi.