Tiếng Việt

Trình chuyển đổi cú pháp làm gì

JSON, YAML, XML, TOML và CSV không giữ những nội dung giống nhau. Trang này nêu chính xác cách ánh xạ từng hình dạng, chuyển đổi nào bị mất và công cụ nào từ chối thực hiện.

Những gì nó chuyển đổi

Chín chuyển đổi hướng: JSON ĐẾN YAML, YAML ĐẾN JSON, JSON ĐẾN XML, XML ĐẾN JSON, JSON ĐẾN TOML, TOML ĐẾN JSON, YAML ĐẾN TOML, TOML ĐẾN YAML, Và JSON ĐẾN CSV. Mọi thứ đều chạy trong tab trình duyệt của bạn; không có gì được tải lên.

Mỗi chuyển đổi hoạt động theo cách giống nhau trong nội bộ: tài liệu nguồn được đọc thành giá trị JavaScript thông thường và giá trị đó được ghi ở định dạng đích. YAML đến TOML không phải là trường hợp đặc biệt, đó là người đọc YAML theo sau là người viết TOML. Đó là lý do tại sao các cảnh báo bên dưới được nêu theo mỗi định dạng chứ không phải theo cặp — cảnh báo về TOML thời gian ngày áp dụng ở bất cứ nơi nào TOML xuất hiện.

CSV chỉ ghi và cố tình làm như vậy. Đọc CSV có nghĩa là đoán một dấu phân cách, một phương ngữ trích dẫn, xem hàng đầu tiên có phải là tiêu đề hay không và loại cho mỗi ô — bốn lần đoán, mỗi lần đoán trong số đó đều được trình chuyển đổi âm thầm sai. Đó là một công việc cho một công cụ yêu cầu.

XML: thuộc tính, mảng và quy tắc chúng tôi đã chọn

XML không có ánh xạ JSON chuẩn, vì vậy các quy ước phải được chọn. Chúng hiển thị trên màn hình bất cứ khi nào XML là một trong hai định dạng và chúng là những định dạng này.

Các thuộc tính trở thành khóa đối tượng có tiền tố @. <user id="7"><name>Ada</name></user> đọc là {"người dùng":{"@id:"7","name:"Ada"}}. Tiền tố là thứ giữ cho một thuộc tính và phần tử con có cùng tên không bị thu gọn thành một khóa — <user id="7"><id>khác</id></user> giữ cả hai.

Văn bản bên trong một phần tử cũng có các thuộc tính hoặc phần tử con nằm dưới khóa #text. Một phần tử không chứa gì ngoài văn bản sẽ thu gọn thành văn bản đó. Phần CDATA nằm trong #cdata, vì vậy nội dung của nó là dữ liệu hiển thị chứ không phải đánh dấu.

Các phần tử anh chị em lặp đi lặp lại sẽ trở thành một mảng. Tên phần tử xuất hiện một lần sẽ không trở thành một mảng — XML khiến trình phân tích cú pháp không có cách nào để phân biệt "danh sách có một mục" với "một giá trị duy nhất" và không trình chuyển đổi nào có thể tạo ra thông tin đó. Nếu bạn cần một hình dạng ổn định, đó là đối số cho một lược đồ chứ không phải cho một công cụ chuyển đổi thông minh hơn.

Tiền tố không gian tên được giữ nguyên nguyên văn: <ns:item> là khóa ns:item và xmlns:ns là thuộc tính @xmlns:ns. Không có gì được giải quyết, viết lại hoặc loại bỏ, bởi vì việc giải quyết tiền tố sẽ loại bỏ văn bản thực sự chứa trong tài liệu.

Thẻ tự đóng đọc dưới dạng một chuỗi trống. Tuyên bố XML, hướng dẫn xử lý và nhận xét sẽ bị loại bỏ. Ngược lại, công cụ sẽ viết phần khai báo của riêng nó và không bao giờ là DOCTYPE.

Việc viết XML, một khóa không phải là tên thành phần XML hợp pháp — một tên có dấu cách, một tên bắt đầu bằng một chữ số, một khóa bắt đầu bằng các chữ cái xml — sẽ bị từ chối theo tên thay vì được viết lại trong âm thầm. Một phần tử được đổi tên lặng lẽ sẽ tạo ra một tài liệu không có giá trị xác thực nào.

Các thực thể bên ngoài bị từ chối, không chỉ bị vô hiệu hóa

Tài liệu XML có thể khai báo các thực thể trong DOCTYPE. Trình phân tích cú pháp mở rộng chúng là lỗ hổng XXE: một thực thể được khai báo SYSTEM "tệp:///etc/passwd" đọc một tệp cục bộ, một thực thể trỏ vào URL đưa ra yêu cầu mà kẻ tấn công kiểm soát và một chuỗi các thực thể nội bộ là hành vi từ chối dịch vụ "tỷ tiếng cười" biến vài trăm byte thành gigabyte.

Trình chuyển đổi này không định cấu hình trình phân tích cú pháp để cẩn thận với DOCTYPE. Nó từ chối bất kỳ tài liệu nào chứa tài liệu đó, trước khi trình phân tích cú pháp được cung cấp một byte đơn, không có tùy chọn tắt tính năng từ chối. Điều đó làm cho sự đảm bảo trở thành một thuộc tính của mã của chúng tôi chứ không phải là cài đặt mặc định của phần phụ thuộc — và sự khác biệt rất quan trọng, bởi vì các giá trị mặc định thay đổi giữa các phiên bản và sự từ chối của chính chúng tôi được bao phủ bởi các thử nghiệm cung cấp cho nó mọi tải trọng XXE tiêu chuẩn và khẳng định rằng không có gì được tìm nạp và không có gì được mở rộng.

Chi phí thực tế: một tài liệu có DOCTYPE sẽ không chuyển đổi ở đây ngay cả khi nó vô hại. Xóa DOCTYPE nếu nội dung là của bạn.

TOML thời gian không có giá trị tương đương ở bất kỳ nơi nào khác

TOML 1.0 có bốn loại thời gian và JSON, YAML và XML không có loại nào: ngày giờ bù trừ (1979-05-27T07:32:00Z), ngày giờ địa phương (1979-05-27T07:32:00, không có vùng, có chủ ý), ngày địa phương (1979-05-27) và giờ địa phương (07:32:00).

Mỗi chuỗi trở thành chuỗi RFC 3339 chính xác như được viết và chuyển đổi cho bạn biết giá trị nào đã thực hiện điều đó và mỗi loại thuộc loại nào trong bốn loại. Giải pháp thay thế — phát ra một UTC tức thời cho cả bốn — sẽ chuyển giờ địa phương vào một vùng mà tài liệu từ chối nêu rõ ràng, đây là một câu trả lời sai chứ không phải là một câu trả lời sai.

Việc chuyển đổi ngược lại sẽ tạo ra các chuỗi được trích dẫn chứ không phải ngày giờ. Do đó, chuyến đi khứ hồi TOML đến JSON đến TOML sẽ thay đổi loại của các giá trị đó. Không có cách nào giải quyết vấn đề này nếu không phát minh ra một quy ước mà công cụ nhận sẽ phải chia sẻ, và việc phát minh ra một quy ước một cách âm thầm sẽ còn tệ hơn.

TOML số nguyên được ký 64-bit; JSON số là IEEE-754 gấp đôi. Một số nguyên quá khứ 2^53 - 1 trở thành một chuỗi, với đường dẫn được đặt tên trong một cảnh báo, thay vì mất các chữ số cuối của nó do làm tròn mà bạn không nhận thấy.

TOML không có giá trị rỗng. Khóa null bị bỏ qua khỏi đầu ra và được đặt tên trong cảnh báo; một giá trị rỗng bên trong một mảng sẽ trở thành một chuỗi rỗng, vì việc loại bỏ nó sẽ làm thay đổi mọi chỉ mục sau này. Gốc của tài liệu TOML luôn là một bảng, do đó, một mảng hoặc giá trị trần ở gốc sẽ bị từ chối kèm theo một câu cho biết lý do.

YAML: mỏ neo, dòng suối và vấn đề ở Na Uy

YAML được đọc bằng lược đồ bị hạn chế chỉ có thể tạo chuỗi, số, boolean, null, danh sách và bản đồ. Các thẻ xây dựng các đối tượng tùy ý — !!js/function, !!python/object/apply, !!binary — bị từ chối, đó là toàn bộ lý do hạn chế tồn tại: một trình tải tôn vinh chúng là một trình xây dựng đối tượng tùy ý mặc quần áo của tệp cấu hình.

Các neo và bí danh được phân giải thành dữ liệu lặp lại. Một tài liệu mở rộng quá một triệu giá trị khi bí danh của nó được theo sau sẽ bị từ chối thay vì được phép đóng băng tab; bí danh đệ quy bị từ chối hoàn toàn vì không có định dạng nào khác ở đây có thể biểu thị một chu trình.

Một luồng gồm nhiều tài liệu được phân tách bằng --- trở thành một mảng tài liệu và quá trình chuyển đổi sẽ cho biết như vậy. Không có định dạng nào khác trong công cụ này có luồng, vì vậy mảng là ánh xạ trung thực duy nhất.

YAML cấm khóa ánh xạ lặp lại và mỗi trình phân tích cú pháp xử lý một khóa khác nhau. Công cụ này giữ giá trị cuối cùng — quy tắc JSON.parse sử dụng — và cho bạn biết điều đó đã xảy ra, cùng với vị trí lặp lại. Việc âm thầm loại bỏ một tài liệu sẽ còn tệ hơn; âm thầm chọn một giá trị mà không nói như vậy sẽ còn tệ hơn.

Vấn đề ở Na Uy: trong YAML 1.1, các đại số vô hướng y, có, bật, không, tắt và mã quốc gia KHÔNG đều phân giải thành boolean, đó là cách danh sách mã quốc gia biến thành danh sách đúng và sai. Công cụ này đọc YAML 1.2, trong đó chỉ có giá trị đúng và sai là giá trị boolean, vì vậy KHÔNG giữ nguyên chuỗi KHÔNG. Khi ghi YAML nó trích dẫn từng chuỗi mà trình phân tích cú pháp 1.1 sẽ đọc sai — 'KHÔNG', 'có', 'bật', '1.0', '0755', '2001-12-14' — vì vậy, đầu ra an toàn để cung cấp cho một công cụ chưa được chuyển sang 1.2. Điều đó tốn một vài ký tự trích dẫn và mua tính chính xác.

Các chuỗi trông giống như số sẽ giữ nguyên dấu ngoặc kép vì lý do tương tự: "0755" vẫn là một chuỗi thay vì trở thành 755 và "1.0" vẫn là một chuỗi thay vì trở thành 1.

Bình luận bị mất theo mọi hướng. JSON, CSV và những người khác không có nơi nào để đặt chúng và không có cách nào để đoán được nơi họ sẽ quay lại.

JSON đến CSV: làm phẳng và dấu nháy đơn dừng công thức

Một mảng trở thành các hàng, mỗi bản ghi cho mỗi phần tử. Một đối tượng có thuộc tính duy nhất chứa một mảng sẽ sử dụng mảng đó làm hàng, bởi vì {"users": [ ... ]} chủ yếu là một bảng có nhãn — và quá trình chuyển đổi cho biết rõ ràng rằng nó đã làm điều đó. Bất kỳ đối tượng nào khác là một hàng duy nhất. Một chuỗi trần, số hoặc null bị từ chối: hình chữ nhật cần có bản ghi.

Các đối tượng và mảng lồng nhau được làm phẳng thành các tên cột có dấu chấm, với một dấu chấm cho cả khóa đối tượng và chỉ mục mảng: address.city, tags.0, tags.1. Một dấu phân cách, một quy tắc. Khóa đã chứa dấu chấm làm cho tên cột của nó trở nên mơ hồ với đường dẫn lồng nhau; công cụ này cảnh báo thay vì phát minh ra một sơ đồ thoát mà không bảng tính nào có thể hiểu được.

Các phím được hợp nhất trên mỗi hàng, theo thứ tự nhìn thấy đầu tiên. Một hàng thiếu một trường sẽ nhận được một ô trống thay vì một cột bị dịch chuyển và quá trình chuyển đổi sẽ cảnh báo rằng các hàng đó bị rách. Một đối tượng trống hoặc mảng trống sẽ trở thành một ô trống dưới đường dẫn riêng của nó thay vì biến mất.

Trích dẫn theo sau RFC 4180: trường chứa dấu phân cách, trích dẫn kép, CR hoặc LF được đặt trong dấu ngoặc kép và trích dẫn nhúng được viết hai lần. Các bản ghi được phân tách bằng CRLF. Các trường có khoảng trắng ở đầu hoặc cuối cũng được trích dẫn vì bảng tính sẽ âm thầm cắt chúng theo cách khác. Unicode không thay đổi và dấu thứ tự byte có thể được đặt trước cho các bảng tính cần mã này để đọc UTF-8.

Công thức tiêm là thứ cắn. Một ô bắt đầu bằng =, +, -, @, một tab hoặc dấu xuống dòng được Excel, LibreOffice Calc và Google Trang tính thực thi dưới dạng công thức ngay khi tệp được mở. =cmd|'/c calc'!A1 là minh chứng mà mọi người trích dẫn; =IMPORTXML(...) là người lặng lẽ gửi tờ giấy đi đâu đó. Trình chuyển đổi ghi nguyên văn chuỗi như vậy đã biến dữ liệu của bạn thành mã thực thi của người khác, trong một tệp trông có vẻ trơ.

Vì vậy, ô văn bản bắt đầu bằng một trong những ký tự đó có tiền tố là dấu nháy đơn mà mọi bảng tính chính đều đọc là "đây là văn bản" và không hiển thị trong ô. Các số được để riêng: số -5 là một số, không phải là công thức. Số lượng ô thoát được báo cáo và tính năng thoát có thể được tắt - trong trường hợp đó, công cụ sẽ hiển thị rõ ràng những gì bạn vừa tắt.

CSV không thể phân biệt chuỗi rỗng với chuỗi rỗng. Cả hai đều trở thành một ô trống và quá trình chuyển đổi sẽ đếm các giá trị rỗng để bạn biết điều đó đã xảy ra.

Giới hạn và điều gì xảy ra khi bạn chạm vào một giới hạn

Mọi định dạng đều có giới hạn ký tự, được thực thi trước khi trình phân tích cú pháp được tải xuống: 8 triệu cho JSON, 4 triệu cho XML và cho nguồn CSV, 2 triệu cho YAML và TOML. Ngoài ra, công cụ còn từ chối con số chính xác thay vì trở thành một tab không phản hồi và làm mất những gì bạn đã dán.

Đầu ra CSV còn bị giới hạn ở 100,000 hàng và 2,000 cột, vì một mảng được lồng sâu sẽ làm phẳng thành một cột cho mỗi phần tử và một vài megabyte JSON có thể trở thành một bảng mà không bảng tính nào có thể mở được.

Đầu vào trống và chỉ có khoảng trắng được báo cáo là trống thay vì được chuyển đổi thành null hoặc tài liệu trống. Cú pháp không hợp lệ được báo cáo bằng một dòng và một cột ở cả bốn định dạng có thể đọc được.

Bản thân các trình phân tích cú pháp chỉ được tải xuống khi một chuyển đổi cần chúng. Việc mở bộ công cụ để giải mã JWT không tìm nạp được chúng.

Điều gì xảy ra với những gì bạn dán

  • Mọi chuyển đổi, băm, giải mã và tìm khác biệt đều chạy trong tab trình duyệt của bạn. Không có đầu vào nào được tải lên, ghi lại hoặc lưu trữ trên máy chủ vì không có máy chủ nào liên quan sau khi trang được tải.
  • Băm đến từ việc triển khai Web Crypto của chính trình duyệt và UUID từ trình tạo ngẫu nhiên được bảo mật bằng mật mã của nó. Không liên quan đến cuộc gọi mạng.
  • Không có nội dung nào bạn nhập được ghi vào bộ nhớ cục bộ hoặc cookie. Tải lại trang sẽ loại bỏ nó; đóng tab sẽ loại bỏ nó.
  • Phân tích trên toàn trang web chỉ chạy trên máy chủ sản xuất chuẩn đã được định cấu hình và được tiết lộ trong Chính sách quyền riêng tư; máy chủ cục bộ và bản xem trước từ chối nó. Các giá trị, mã thông báo, URL và nội dung tệp đã dán sẽ bị loại trừ khỏi các sự kiện phân tích của chính ToolAcre. Quảng cáo bị vô hiệu hóa trong cấu hình hiện tại.
  • Điều đó cho biết: khóa JWT hoặc API là thông tin xác thực trực tiếp. Thói quen an toàn là không bao giờ dán nội dung này vào trang web mà bạn không viết, cho dù những tuyên bố của trang đó có đáng tin cậy đến đâu đi nữa - bao gồm cả trang này.

Câu hỏi

Tại sao tài liệu XML của tôi không thành công với "khai báo DOCTYPE"?

Bởi vì nó chứa khai báo loại tài liệu và trình chuyển đổi này từ chối mọi tài liệu trong số đó thay vì tin cậy vào cài đặt trình phân tích cú pháp để xử lý các thực thể một cách an toàn. Xóa DOCTYPE nếu nội dung là của bạn. Không có tùy chọn để cho phép nó.

Tại sao ngày giờ TOML của tôi lại xuất hiện dưới dạng chuỗi được trích dẫn?

Vì JSON, YAML và XML không có loại ngày. Ngày giờ đã được chuyển đổi thành văn bản RFC 3339 mà nó được viết dưới dạng, là một chuỗi ở mọi định dạng khác. Do đó, việc chuyển đổi ngược sẽ tạo ra một chuỗi và công cụ sẽ cảnh báo bạn tại thời điểm điều đó xảy ra thay vì để bạn tìm hiểu sau.

Tại sao một trong các ô CSV của tôi bắt đầu bằng dấu nháy đơn?

Bởi vì văn bản của nó bắt đầu bằng =, +, -, @, một tab hoặc dấu xuống dòng và bảng tính thực thi một ô như vậy dưới dạng công thức khi tệp được mở. Dấu nháy đơn đánh dấu ô là văn bản; nó không phải là một phần của giá trị khi ô được đọc. Bạn có thể tắt tính năng thoát và công cụ sẽ cho bạn biết điều đó có nghĩa là gì.

Tại sao một phần tử XML lặp lại không phải là một mảng?

Bởi vì XML không cung cấp cách nào để phân biệt danh sách một danh sách với một giá trị duy nhất. Cả hai đều được viết giống hệt nhau. Việc đoán theo một trong hai hướng sẽ có một nửa thời gian sai, vì vậy công cụ sẽ báo cáo những gì thực sự ở đó.

Tôi có thể chuyển đổi CSV thành JSON tại đây không?

Không. Việc đọc CSV chính xác yêu cầu phải quyết định dấu phân cách, phương ngữ trích dẫn, xem hàng đầu tiên có phải là tiêu đề và loại cho mỗi ô hay không. Một công cụ chuyển đổi đoán cả bốn đều sai một cách lặng lẽ, đó là cách sai tồi tệ nhất. Sử dụng công cụ CSV để hỏi.

Tại sao "KHÔNG" không được chuyển thành sai?

Bởi vì hành vi đó thuộc về YAML 1.1 và công cụ này ghi YAML 1.2, trong đó chỉ có giá trị boolean đúng và sai. Hành vi 1.1 là lý do khiến mã quốc gia của Na Uy trở thành trò đùa trong quản lý cấu hình. Khi công cụ ghi YAML nó trích dẫn các chuỗi như vậy nên không có trình phân tích cú pháp 1.1 nào ở phía dưới có thể đọc sai chúng.

Hạn chế

  • CSV đã được viết, chưa bao giờ đọc. Không có chuyển đổi CSV sang JSON ở đây, theo lựa chọn.
  • Nhận xét bị mất theo mọi hướng, ở mọi định dạng có chúng.
  • Ngày giờ TOML trở thành một chuỗi ở mọi định dạng khác, do đó, chuyến đi khứ hồi TOML sẽ thay đổi các loại đó. Không có con đường lossless.
  • Tài liệu XML chứa DOCTYPE sẽ bị từ chối hoàn toàn, kể cả những tài liệu vô hại và không thể tắt việc từ chối.
  • Không thể phân biệt được một phần tử XML lặp lại với một phần tử không lặp lại, vì vậy XML đến JSON đến XML không phải lúc nào cũng trả về hình dạng ban đầu.
  • XML nội dung hỗn hợp — văn bản được xen kẽ với các phần tử con — làm mất vị trí của văn bản so với các phần tử con và không thể quay vòng.
  • Các giá trị XML là các chuỗi trừ khi suy luận kiểu được bật, vì XML không khai báo loại nào; với suy luận về "0755" và "KHÔNG" có thể bị đọc sai thông thường.
  • TOML không có giá trị rỗng: các khóa rỗng bị loại bỏ khỏi đầu ra TOML và các giá trị rỗng bên trong mảng trở thành chuỗi trống.
  • Gốc của tài liệu TOML phải là một bảng, do đó, mảng JSON hoặc vô hướng không thể được chuyển đổi thành TOML.
  • JSON số là IEEE-754 gấp đôi. Các số nguyên trước 2^53 được chuyển đổi thành chuỗi thay vì được làm tròn âm thầm, điều này làm thay đổi loại của chúng.
  • CSV không thể phân biệt chuỗi trống với chuỗi rỗng; cả hai đều được viết dưới dạng ô trống.
  • CSV làm phẳng sử dụng dấu chấm cho cả khóa đối tượng và chỉ mục mảng, do đó, khóa đã chứa dấu chấm sẽ tạo ra tên cột mơ hồ được cảnh báo nhưng không thoát được.
  • YAML các neo và bí danh được giải quyết thay vì được giữ nguyên; đầu ra không có điểm neo và bí danh đệ quy bị từ chối vì không có định dạng đích nào có thể biểu thị một chu trình.
  • Đầu vào bị giới hạn cho mỗi định dạng — 8 triệu ký tự cho JSON, 4 triệu cho XML, 2 triệu ký tự cho YAML và TOML — và các tài liệu quá khổ bị từ chối thay vì được xử lý chậm.
  • Không có gì ở đây xác nhận đối với một lược đồ. Một tài liệu có thể chuyển đổi sạch sẽ nhưng vẫn sai mục đích.