開發者工具·語法轉換器
YAML 到 JSON 類型強制: yes、no 和 0777 如何改變意義
· 工作原理
yaml json 資料格式
YAML 將未加引號的標量解析為類型,並 YAML 1.1 和 1.2 之間的規則有所不同。這篇文章準確地展示了轉換器如何確定一個值是布林值、整數、浮點數還是字串,以及如何控制結果。
傳回為 true 的值 — 一個普通的 YAML 標量,表示文字,轉換為 JSON 作為布林值,然後服務出現異常行為
諸如以下的值`NO`在 YAML 1.1 載入器中可能會變成 false,但這不是此轉換器所提供的。兩個都ToolAcre選擇使用 YAML 1.2 模式,因此`NO`, `yes`, `no`, `on`和`off`保留字串。更正後的開口很重要,因為有一個例子聲稱該面板轉動`NO`判斷為真或假會教出與其測試行為相反的內容。
類型驚喜依然存在。在預設的 JSON 模式下,`null` 為 null,而 `~`(空值)和 `0o755` 仍為字串。選擇 Core 會將這三種形式變更為 null、null 和 493。輸出非常有用,因為它公開了已解析的 JavaScript 值,而不是假裝每個普通 YAML 標記都帶有明顯的類型。
保留文字在 YAML 1.2 下的值
js-yaml 讀取原始程式碼時會發生隱式解析。在轉換器寫入 JSON 之前,所選的受限模式會決定普通標量是否與空值、布林值或數字形式相符。引用繞過了這個決定: `"0o755"` 是任一模式下的文字,塊標量仍然是一個字串,包括由其 chomping 指示符表示的換行符。
這是解析和序列化,而不是正則表達式替換。讀者建立字串、數字、布林值、空值、陣列和物件; `JSON.stringify` 然後發出具有所選縮排的這些值。註解和標記拼字已經在寫入階段消失,因此沒有序列化程序可以重建數字是否最初是十進制的或以另一種可接受的 YAML 表示法寫入的。
YAML 1.1 規則 — yes/no/on/off 布林值,0777 為八進制,1:30 為六十進制,版本字串(如 1.10)讀取為浮點數
此大綱列出了 YAML 1.1 強制轉換,例如六十進位時間和舊八進位。它們是相關的兼容性危害,但它們不是此處可用的模式。 ToolAcre 故意不提供 1.1 架構。它的 UI 表示,兩個附帶選項均未將 `NO` 讀取為 false,並測試將該國家代碼和單字 yes、no、on 和 off 作為字串固定。
該邊界改變了調試方法。如果另一個應用程式將這些單字轉換為布林值,請將其解析器配置與 ToolAcre 進行比較,而不是期望相同的輸出。轉換器可以顯示它自己的兩個模式所產生的結果;它無法驗證稍後使用該檔案的 CI 執行程式、框架或部署系統所使用的架構或版本。
YAML 1.1 強制轉換是此轉換器避免的危險
預設 JSON 模式僅接受與 JSON 模型相容的標量拼字。 Core 新增了熟悉的 YAML null 形式、十六進位和八進位整數、Infinity 和 NaN。核心仍然停留在受限制的載入器內:特定於語言的物件標籤、日期、集合、有序映射和二進位標籤被拒絕而不是被建構。
無穷大和 NaN 揭示了另一個邊界。 JavaScript 可以保存它們,但 JSON 無法寫入它們。轉換器識別每個路徑並警告該值變為空。這是公認的有損步驟,而不是無損轉換。帶引號的 `.inf` 可以避免這種情況,因為該值仍然是文字字串 `.inf`。
兩個已發佈的 YAML 1.2 模式僅在記錄的標量形式上有所不同
貼上 `tilde: ~`、`empty:`、`octal: 0o755`、`country: NO` 與 `answer: yes`。在嚴格選擇的情況下,JSON 值為 `"~"`、`""`、`"0o755"`、`"NO"` 和 `"yes"`。選擇 Core 後,只有前三個改變:波形符號和空變成 null,八進位變成 493。國家/地區和答案在兩個輸出中均保留文字。
現在引用每個值並重複。兩種模式都傳回字串,因為來源宣告了預期的類型。這種比較是程式碼準確的,並比在從不載入 1.1 的工具中對比 YAML 1.1 與 1.2 更有用。它還提供了一個可審查的固定裝置,用於檢查另一個解析器,而無需僅根據其檔案進行猜測。
工作範例:ToolAcre 的嚴格模式和核心模式下的一個檔案
只有當受限模式識別明確標準標記時,它們才會被接受:`!!str 123` 變成字串 `123`,而 `!!int "7"` 變成數字 7。 `!!binary`、`!!timestamp`、`!!set`、`!!js/function` 等標籤和 Python 物件建構子將被拒絕。這可以防止 YAML 讀取器成為任意物件工廠。
引用仍然是可移植的選擇。它保留前導零、版本拼字和標記詞,而不依賴另一個工具中存在的明確標籤。 JSON 結果顯示所選類型,但它不能攜帶產生該值的引號樣式或標記。
這不包括 - 對結果 JSON 的應用程式層級解析,這可能會再次強制類型(例如,字串 '1' 為數字)
應用程式程式碼可能會再次強制產生 JSON。 API 可以讀取 `"1"` 並將其轉換為數字,或根據架構拒絕它。語法轉換器在產生 JSON 文字後停止;它不執行框架驗證器、環境變數載入器或業務規則。因此,乾淨的轉換證明了語法和映射,而不是最終服務的接受。
重複的 YAML 金鑰是一個單獨的問題。 ToolAcre 保留最後一個值並報告帶有位置的重複鍵。多重串流變成數組。即使每個標量類型都是預期的,這些選擇也可能會改變應用程式看到的內容,因此請閱讀警告,而不是僅判斷格式化的 JSON 主體。
重點:引用機器可能誤讀的任何內容 - 以及如何在瀏覽器中將 YAML 轉換為 JSON 準確揭示每個標量解析的內容
引用類似機器令牌的文字,然後檢查 JSON 類型。當您想要最小的 JSON 形標量詞彙時,請使用 strict;當需要 YAML null 和數字形式時,請故意選擇 Core。這兩個選項都不是 YAML 1.1,也不會讓下游消費者遵循相同的規則。
此面板使其解析器選擇可見,並針對沒有目標可以表示的值返回警告。這是一個誠實的承諾:它揭示了該實現如何解決每個標量。它不宣告通用 YAML 行為或透過往返保留註解、標籤和拼字。