開發者工具·語法轉換器
JSON 是否有效 YAML? YAML 1.2 的承诺以及它的破坏之處
· 背景
json yaml 資料格式
YAML 1.2 的設計使每個 JSON 文件也是一個 YAML 文件,這就是為什麼 JSON 到 YAML 的感覺微不足道。這篇文章解釋了規範實際保證的內容以及承諾失敗的邊緣情況。
將 JSON 貼到 YAML 檔案中並擺脫它 - 為什麼它有效,並有一次它不起作用
普通的 JSON 物件可以貼上到 YAML 來源端並在 ToolAcre 的 YAML 1.2 JSON 模式下讀取。大括號、括號、引號的鍵、字串、數字、布林值和 null 成為相同的純 JavaScript 值。這就解釋了為什麼邊界常常讓人感覺微不足道。
保證應保持特定於解析器。 ToolAcre 限制標籤、限制別名和嵌套,並套用輸入限制。文字可以在更廣泛的 YAML 處理器下有效,但由於與其 JSON 外觀核心無關的安全或形狀原因而被拒絕。
普通 JSON 透過此 YAML 1.2 讀卡機載入;不受支援的擴充因不同原因而失敗
選取的模式會產生 JSON 形狀的值:字串、數字、布林值、null、陣列和映射。這種對齊方式支援解析然後序列化,而不是標點符號替換。原始程式碼並未建立 YAML 規範的所有措詞或勘誤表,因此本文報告了經過測試的行為,而不是聲稱完全符合。
在嚴格模式下,波形符號、空值和 `0o755` 保留字串。這些是 YAML 令牌,JSON 本身不會包含。核心以不同的方式解析它們,同時仍傳回 JSON 形狀的輸出。
提供的模式與 JSON 形資料對齊,無需證明每個規範邊緣
重複的 YAML 映射鍵保留最後一個值並帶有警告;其他地方的嚴格解釋可能會拒絕它們。舊版 YAML 1.1 讀者可以以不同方式鍵入諸如 `NO` 之類的單詞,而本閱讀器將它們保留為字串。這些差異使廣泛的可移植性宣告變得複雜。
用作縮排的製表符會產生錯誤,而帶引號的 JSON 字串內的製表符會被轉義。非常深或過大的值可能會達到當地的安全上限。理論語言關係不會超越實現邊界。
重複鍵和遺留解析器差異仍然是互通性邊界
對於這個價值管道來說,相反的情況顯然是錯誤的。 YAML 註解沒有 JSON 表示,別名解析為重複數據,多文檔流變成數組,並且拒絕不支援的標籤。塊標量變成字串,但它們的表示丟失。
即使受支援的 YAML 檔案也可以轉換為有效的 JSON 並永遠不會傳回相同的 YAML 文字。對於普通值來說,資料平等可能會存在,而註釋、錨點、拼字和流標識則不然。
這對於轉換意味著什麼 — JSON 到 YAML 是樣式更改,YAML 到 JSON 是可能丟失訊息的翻譯
JSON-to-YAML 通常是 JSON 形狀輸入的樣式和序列化變更。 YAML-to-JSON 先解釋 YAML 特定語法,然後將結果投影到 JSON 的較小值模型中。方向不對称。
ToolAcre 測試包含巢狀值、Unicode、空值、陣列和模糊字串的普通 JSON-to-YAML-to-JSON 檔案。這些裝置證明了所覆蓋的資料類,而不是每個可能的 JSON 或 YAML 處理器對。
工作範例:載入為 YAML 的 JSON 檔案 — 相同的結構,然後新增僅 YAML 的功能以顯示 JSON 工具停止的位置
將 `{"country":"NO","items":[1,null],"nested":{"ok":true}}` 貼上為 YAML 輸入。嚴格的讀者返回同一棵树。新增 YAML 註釋,註釋消失時該值保持不變。用錨點和別名取代重複的物件; JSON 現在包含副本而不是引用語法。
新增 `---` 和第二個檔案;結果變成帶有警告的文件陣列。加`!!binary`;受限制的讀者拒絕它。每個步驟都標記了一個明顯的邊界:忽略的表示、解析的結構、流約定和不支援的類型。
這不包括 - 模式級相容性,其中 YAML 類型(如時間戳記)沒有 JSON 對應項
模式相容性不僅與表面語法有關。核心可以建立 Infinity 或 NaN,JSON 將其寫入 null 並發出警告。時間戳記和二進位標籤在受限模式下被拒絕而不是被轉換。 ToolAcre 故意將 YAML 縮小為安全的 JSON 形狀的資料。
另一個 YAML 實作可能支援其他類型。這使得它在這些點上與普通的 JSON 值不太相容,不會自動變得更好或更差。根據目標合同和安全要求进行選擇。
模式級相容性包括此受限讀取器限製或拒絕的非有限值和時間標記
普通 JSON 形狀的資料乾淨地通過此 YAML 1.2 讀取器和寫入器。關於所有檔案或解析器的更廣泛的宣告需要涵蓋重複鍵、模式版本、標籤和資源限制的固定裝置。
使用語法轉換器測試實際文字並閱讀其警告。只有在命名解析器、模式和使真實邊界精確的不受支援的功能之後,才將「JSON is YAML」視為有用的簡寫。
對於可移植性測試,將一個燈具完全保留在 JSON 的價值模型內,而另一個燈具一次只添加一個 YAML 功能。通過每個目標消費者執行這两者。第一個衡量實際子集主張;第二個準確識別註釋、別名、流、標籤或標量規則的分歧點。這種分階段的方法比詢問兩種語言是否是抽象的子集更能提供信息,因為它會產生與系統實際使用的解析器相關的失敗。