Công cụ dành cho nhà phát triển · Trình chuyển đổi cú pháp
YAML tính năng bị mất trong chuyển đổi JSON: nhận xét, liên kết và thẻ
· Cách thức hoạt động
yaml json data-formats
YAML có nhận xét, liên kết, bí danh, khóa hợp nhất, thẻ và luồng nhiều tài liệu; JSON không có cái nào trong số đó. Bài đăng này giải thích công việc của trình chuyển đổi với mỗi trình chuyển đổi và tại sao việc chuyển đổi ngược lại không bao giờ khôi phục được tệp gốc.
Tệp quay lại lâu hơn và không có một nhận xét nào — cấu hình YAML được chuyển đổi thành JSON và quay lại, cũng như mọi thứ không tồn tại
Tệp YAML có thể quay lại từ JSON lâu hơn ngay cả sau khi mọi nhận xét biến mất. Các neo chia sẻ một ánh xạ sẽ được phân giải thành dữ liệu đối tượng lặp lại, do đó, trình tuần tự hóa ghi từng bản sao một cách độc lập. Các giá trị có thể vẫn thống nhất, tuy nhiên cấu trúc tác giả và lời giải thích đã biến mất.
Đó là lý do tại sao chuyến đi khứ hồi YAML-to-JSON-to-YAML phải được đánh giá là chuyển đổi dữ liệu chứ không phải bảo toàn nguồn. ToolAcre đọc biểu đồ giá trị hạn chế và viết tài liệu mới. Nó không bao giờ giữ lại một cây cú pháp cụ thể chứa các nhận xét, tên neo, lựa chọn trích dẫn hoặc cách trình bày vô hướng khối.
Nhận xét - tại sao JSON không có chỗ cho chúng và # dòng đều biến mất sau khi chuyển đổi
Nhận xét bị trình phân tích cú pháp YAML loại bỏ vì JSON không có nút nhận xét. Một dòng bắt đầu bằng `#` có thể giải thích lý do tồn tại thời gian chờ hoặc ai sở hữu dịch vụ; một khi đã bị xóa, không thuật toán nào có thể suy ra từ ngữ hoặc vị trí. Việc chuyển đổi ngược lại sẽ tạo YAML hợp lệ mà không có ngữ cảnh hoạt động đó.
Giữ nguyên tệp gốc trong kiểm soát phiên bản và xem xét các khác biệt trước khi thay thế nó. Nếu mục tiêu chỉ là kiểm tra các giá trị đã phân giải thì JSON sẽ hữu ích. Nếu mục tiêu là định dạng lại trong khi vẫn giữ lại chú thích thì trình chuyển đổi giá trị chung này là cách trình bày sai.
Các neo và bí danh - &default và *default được mở rộng thành các bản sao lặp lại và kết quả là tệp phát triển như thế nào
Các neo và bí danh được chấp nhận trong giới hạn an toàn, sau đó được giải quyết. `base: &b {x: 1}` và `copy: *b` trở thành hai đường dẫn đối tượng chứa `x: 1`. Đầu ra YAML sử dụng `noRefs`, do đó nhận dạng đối tượng được chia sẻ không tạo ra các neo mới. Mối quan hệ nhỏ gọn không còn nữa ngay cả khi các giá trị lặp lại vẫn tồn tại.
Bí danh đệ quy bị từ chối vì JSON không thể biểu thị chu kỳ. Việc mở rộng bí danh được giới hạn bởi số lượng bí danh, lồng nhau và phép đo nút mở rộng; một tài liệu ngắn có thể xâu chuỗi thành hơn một triệu giá trị sẽ bị dừng lại. Điều này bảo vệ tab mà không yêu cầu hỗ trợ YAML tùy ý.
Hợp nhất các khóa — quy ước <<: từ YAML 1.1, cách các trình phân tích cú pháp hỗ trợ nó làm phẳng ánh xạ đã hợp nhất và điều gì xảy ra với các khóa không hỗ trợ
Phác thảo giả định YAML 1.1 các khóa hợp nhất được làm phẳng. ToolAcre chỉ tải lược đồ JSON hoặc Core của js-yaml, cả hai lược đồ này đều không bật loại hợp nhất. Trong các lược đồ này, khóa `<<` là dữ liệu thông thường chứ không phải là hướng dẫn hợp nhất ánh xạ. Do đó, việc trình bày một sự hợp nhất phẳng dưới dạng hành vi được vận chuyển sẽ là sai.
Nếu nguồn của bạn phụ thuộc vào ngữ nghĩa của khóa hợp nhất, hãy giải quyết nó trong ứng dụng sở hữu quy ước đó hoặc viết lại các giá trị một cách rõ ràng trước khi chuyển đổi. Bí danh được sử dụng làm giá trị thông thường `<<` vẫn có thể phân giải thành một đối tượng nhưng khóa vẫn là `<<`; điều đó không tương đương với việc hợp nhất các thành viên của nó vào cha mẹ.
Khóa hợp nhất không được kích hoạt bởi hai lược đồ bị hạn chế mà trình chuyển đổi này cung cấp
Thẻ rõ ràng tiêu chuẩn được lược đồ hạn chế công nhận có thể chọn các loại cơ bản, chẳng hạn như `!!str` hoặc `!!int`. Các thẻ tùy chỉnh và phong phú hơn—bao gồm nhị phân, dấu thời gian, tập hợp, bản đồ theo thứ tự, hàm JavaScript và hàm tạo đối tượng Python—đều bị từ chối. Chúng không được xâu chuỗi và không bao giờ được thực thi.
Luồng YAML được phân tách bằng `---` được chấp nhận. Một tài liệu trở thành một giá trị; một số trở thành một mảng kèm theo cảnh báo đặt tên cho số lượng tài liệu. Dấu phân cách ở cuối có thể tạo tài liệu cuối cùng trống theo lược đồ đã chọn. Không có mục tiêu nào ở đây có mô hình luồng, vì vậy mảng là một quy ước được khai báo.
Thẻ không an toàn bị từ chối; luồng nhiều tài liệu trở thành mảng
Sử dụng `defaults: &d` với số lần thử lại và hết thời gian chờ, nhận xét giải thích về thời gian chờ, sau đó sử dụng `service:` với `inherited: *d`. JSON chứa cả giá trị mặc định và đối tượng được kế thừa lặp lại; bình luận và tên neo không có. Việc chuyển đổi JSON ngược lại sẽ phát ra hai ánh xạ thay vì mối quan hệ neo.
Thêm `---` theo sau là một tài liệu khác và gốc JSON sẽ trở thành một mảng tài liệu. Thêm `!!binary` và quá trình chuyển đổi sẽ dừng với gợi ý lược đồ bị hạn chế. Ba thay đổi này phân biệt dữ liệu được hỗ trợ đã giải quyết, quy ước về cấu trúc và cấu trúc hoàn toàn không được hỗ trợ.
Điều này không bao gồm những gì - thứ tự chính và kiểu trích dẫn, thường tồn tại nhưng không được đảm bảo bởi một trong hai định dạng
Thứ tự chèn đối tượng thông thường thường vẫn hiển thị, nhưng nó không được bảo toàn theo kiểu nguồn và việc chọn các phím sắp xếp có chủ ý thay đổi nó. Các trích dẫn, kiểu dòng chảy so với kiểu khối, cách viết vô hướng và nhận xét không tồn tại. Các khóa ánh xạ trùng lặp giữ giá trị cuối cùng kèm theo cảnh báo thay vì giữ nguyên cả hai mục nhập không hợp lệ.
Người viết bảo vệ các chuỗi không rõ ràng bằng cách trích dẫn các giá trị mà người tiêu dùng YAML 1.1 có thể đọc sai nhưng lựa chọn an toàn đó có thể khác với phong cách ban đầu của tác giả. Sự bình đẳng dữ liệu là thử nghiệm có thể bảo vệ được đối với các giá trị có hình dạng JSON thông thường; sự bình đẳng về văn bản là không.
Thứ tự chính có thể được giữ nguyên, trong khi nhận xét, liên kết, chính tả thẻ và kiểu không được giữ nguyên
YAML-to-JSON bị mất bất cứ khi nào ý nghĩa nằm ngoài giá trị có hình JSON: nhận xét, bí danh, thẻ không được hỗ trợ, ranh giới luồng và kiểu. ToolAcre hiển thị một số tổn thất và từ chối các cấu trúc nguy hiểm hoặc mang tính chu kỳ thay vì giả vờ bảo toàn chúng.
Chuyển đổi tệp đại diện trước khi áp dụng quy trình làm việc. Kiểm tra các cảnh báo, các giá trị được giải quyết khác biệt và giữ lại YAML tác giả. Bảng điều khiển là một thấu kính tuyệt vời về những gì trình phân tích cú pháp nhìn thấy, nhưng nó không phải là trình soạn thảo lưu giữ nhận xét hoặc trình biến đổi mô hình đối tượng YAML đầy đủ.
Để xem xét di chuyển, hãy tách riêng các thay đổi giá trị khỏi các thay đổi chỉ nguồn. Sự so sánh sâu JSON có thể xác định liệu các giá trị thông thường có tồn tại hay không, trong khi sự khác biệt về văn bản cho thấy các nhận xét, điểm cố định và phong cách nhất thiết phải thay đổi. Không kiểm tra nào thay thế kiểm tra khác. Gọi giá trị so sánh không mất dữ liệu sẽ bỏ qua thông tin nguồn; gọi mọi thay đổi văn bản là lỗi dữ liệu sẽ bỏ qua việc tuần tự hóa lại hợp lệ.