YAML 轉 JSON 失敗時,先不要在正式設定檔裡反覆加減空白。保留原始檔,複製一份已移除密鑰、Token、主機名稱與真實路徑的最小片段,只修畫面顯示的第一個結構問題;上層縮排一旦錯位,後面的正確行也可能跟著被判定有錯。
先把錯誤縮成一個可以安全檢查的片段
最小片段的目的不是重寫整份設定,而是確認哪一段開始失去父子關係。先複製原檔作為唯讀備份,再在另一份測試檔中保留出錯項目的父層、同層的一個正常項目,以及下一個子層;其餘內容暫時刪除或換成假資料。
例如部署設定中有 services 清單,每個服務又包含 name、ports 與 environment。若錯誤出現在第二個服務,不必把憑證、正式網域與所有環境變數貼進網頁。只保留兩個假服務,將值改成 demo-a、demo-b 與測試連接埠,仍能觀察清單符號和縮排是否落在相同層級。
縮小內容時要保留真正會影響解析的字元。不要把可疑的冒號、引號、清單前綴或前導空白一併「整理掉」,否則錯誤可能在貼入工具前就消失。若檔案來自版本控制,可另外記下目前提交或檔案雜湊;檢查過程始終操作副本,不覆寫唯一的可用版本。
從第一個縮排與結構錯誤開始查
YAML 用空白表達層級,同一父層下的同類項目應對齊。先找到第一個被指出的行號,再比較它與前一個同層項目的起始位置;不要一次調整後面十幾行,因為那會讓你無法判斷真正的起點。
排查時依序看這幾件事:
- 行首是否混入 Tab。本站目前的基本解析器不接受以 Tab 作為縮排,應改用一致的空白,但不要用全檔取代把字串內容中的 Tab 也改掉。
- 清單項目的
-是否位於同一欄,清單底下的 mapping 是否比-再往內一層。 - mapping 的鍵後面是否有冒號;冒號若屬於值的一部分,應確認引號與空白讓解析器不會把它誤認成新的鍵值分隔。
- 單引號與雙引號是否成對。含
#、前後空白或容易被當成布林值、空值、數字的文字,可明確加上引號。 - 某一層原本應全部是清單,是否意外混入 mapping;或原本應是 mapping,卻多了一個清單前綴。
一次只改一處,重新解析後再往下一個錯誤移動。畫面指出的行通常是「解析器無法繼續」的位置,不一定就是最早輸入錯誤的位置;若該行看起來正常,往上檢查最近的父層、未成對引號與清單起點。
用基本 YAML 轉換器觀察資料形狀
把脫敏後的測試片段貼到 YAML 與 JSON 互轉工具,按下 YAML 轉 JSON。成功時,右側會顯示縮排過的 JSON;失敗時,狀態區會顯示解析錯誤。重點不是只看到綠色成功訊息,而是確認輸出的物件與陣列層級是否符合原本意圖。
目前的 yaml-json 元件只處理基本子集,包括巢狀 mapping、清單、一般或引號字串、布林值、null、整數與簡單小數。它會明確拒絕 block scalar、anchor、alias、tag 與 flow collection;註解也不會成為 JSON 資料。若正式檔案使用 |、>、&name、*name、自訂 tag,或 { key: value } 這類 flow 寫法,就不應為了讓這個簡化工具通過而改壞原本合法的 YAML。
輸出後逐層回答具體問題:services 是陣列還是物件?ports 是否仍在正確服務底下?看似數字的郵遞區號或版本號是否被解析成數值?原本必須是字串的 true、null 或前導零代碼是否需要引號?形狀不對時,轉換雖然成功,程式仍可能讀到錯誤型別。
比對修改前後,但不要把轉換成功當成驗收
修好最小片段後,先把變更套用到另一份完整工作副本,再用 文字差異比對工具查看修改前後。比對工具只顯示文字增刪,不理解 YAML 層級,因此要特別確認是否只動到預期的縮排、引號或符號,而不是無意間改了值、路徑或環境名稱。
若右側 JSON 還需要確認語法,可將不含敏感資訊的結果放入 JSON 格式化器再次驗證與展開。不過第二次 JSON 驗證只能證明輸出是合法 JSON,不能證明欄位名稱、資料型別、必要屬性或業務規則符合使用端要求。
最後一定要回到真正會讀取設定的程式。使用該應用程式提供的設定檢查、測試環境或 dry-run,確認 schema、必要欄位、允許值與版本需求;通過後再依既有審核流程替換設定。ToolboxHub 不會開啟、編輯、儲存或部署你的 YAML 檔,它只處理你貼入頁面的文字並顯示轉換結果。
完成後做一次可回復的驗收
排錯完成的標準不是錯誤訊息消失,而是變更範圍清楚、原檔可回復,而且實際使用端接受新設定。送出前可留下簡短紀錄,包含第一個錯誤位置、實際改動、工具輸出的結構,以及應用程式驗證結果。
- 確認正式副本仍不含測試用的假網域、假密鑰或示例連接埠。
- 對照差異,只保留已說明的縮排、引號與結構修改。
- 重新開啟完整檔,檢查檔案編碼、換行與結尾是否符合專案規範。
- 在非正式環境執行應用程式自己的驗證,並確認錯誤沒有轉移到下一個必要欄位。
- 保留原始備份到變更完成審核;不要因線上轉換成功就刪除唯一可用版本。
常見問題
為什麼錯誤行看起來沒有問題?
解析器常在無法繼續時才報錯,真正原因可能位於上方的父層縮排、未關閉引號或清單起點。先往上找最近一個結構邊界,再逐次修一處。
YAML 可以用 Tab 縮排嗎?
本站目前的基本轉換器會拒絕行首 Tab。測試副本應改用一致空白,但正式專案仍要遵循其 YAML 解析器、格式化規則與團隊設定。
成功轉成 JSON 就代表設定檔正確嗎?
不代表。成功只說明這個基本子集能形成某個 JSON 結構,無法驗證應用程式 schema、必要欄位、值域、版本或外部資源是否正確。
為什麼 anchor 或多行文字無法轉換?
目前工具不支援 anchor、alias、tag、block scalar 與 flow collection。請使用支援完整 YAML 規格且符合專案版本的解析器,不要把合法進階語法硬改成不同含義。
可以把正式密鑰貼進工具一起檢查嗎?
不建議。只貼能重現問題的脫敏片段,將 Token、密碼、內部網域、客戶資料和真實路徑換成假值;完成後仍要遵循組織的資料處理規範。