繁體中文

開發者工具 · JSON 格式化程式和驗證程序

為什麼 JSON 行檔案在 2 行、1 欄位驗證失敗

· 工作原理

json 開發人員工作流程 驗證

為什麼 JSON 行檔案在 2 行、1 欄位驗證失敗,並以 JSON 標記和精確的驗證邊界進行說明
原始 ToolAcre 向量圖

.jsonl 檔案由許多 JSON 檔案組成,而不是一個,因此嚴格驗證器恰好在第二個檔案開始的地方停止。這篇文章解釋了 JSON 行和 NDJSON 約定以及如何一次驗證它們的一筆記錄。

每行都有效,作為檔案無效

每行都有效,作為檔案無效 - 每個下游工具都會愉快地讀取匯出,但驗證器會在第二行拒絕。日誌傳送器可以將每個換行符號作為記錄邊界,但嚴格的 JSON 解析器將整個檔案視為一個輸入。第一個物件是完整的 JSON;下一個左大括號是非法的第二個根值。

ToolAcre 驗證一個 JSON 文字,而不是 JSON 行。一旦掃描器完成第一個根值,在 JSON 值末尾之後的任何後續非空白字元都會被報告為意外字元。它不提供每行 NDJSON 驗證或轉換作為隱藏的後備。這種區別可以防止綠色結果暗示已檢查面向行的流中的每個記錄。

一個文字,一個值 — RFC 8259 定義為 JSON 文字以及為什麼連續兩個頂級值是語法錯誤

一個文字,一個值 — RFC 8259 定義為 JSON 文字,以及為什麼連續兩個頂級值是語法錯誤。 JSON 文字是序列化值,因此物件、陣列、字串、數字、布林值或 null 可以位於根。空格可能包圍該值,但它不能將多個根分隔成更大的有效檔案。

例如, `{"ok":true} {"ok":false}` 包含兩個單獨有效的對象,但不是一個 JSON 文字。解析第一個物件消耗一個完整的值;解析整個字串必須拒絕第二個 `{`。若要以普通 JSON 表示這兩個值,請將它們放入陣列中並在陣列元素之間新增所需的逗號。

JSON 線路和 NDJSON

JSON 行和 NDJSON — 換行符號分隔約定,為什麼它們存在於流和日誌中,以及它們與 JSON 數組有何不同。每個實體行都攜帶一個完整的 JSON 值,通常是一個對象,換行符充當 JSON 語法之外的框架。生產者可以追加記錄,消費者可以增量地處理它們,而無需加載完整的集合。

陣列具有一個左括號、逗號分隔的元素和一個右括號,使整個檔案成為一個 JSON 值。對於傳回有界集合的 API 來說很方便,但對於無限成長的事件流來說則很尷尬。截斷的 JSON 行檔案可以保留所有完整的早期記錄;截斷的陣列通常會使封閉的值未完成。

為什麼錯誤總是出現在2行,1列

為什麼錯誤總是出現在 2 行、1 欄位 — 解析器完成第一個值,期望輸入結束,並遇到第二筆記錄的第一個字元。換行符本身是合法的尾隨空格,因此不會觸發失敗。下一筆記錄的左大括號是第一個與已完成檔案狀態相矛盾的標記。

該位置是診斷證據,而不是第二個物件格式錯誤的宣告。如果報告始終指向有效根後的第一個非空白字符,請在編輯標點符號之前檢查檔案形狀。刪除大括號會破壞記錄;選擇行感知讀取器或將記錄轉換為數組可以解決實際的幀不匹配問題。

工作範例:驗證三個日誌記錄

工作範例:驗證三個日誌記錄 - 單獨檢查每一行,而不是用逗號將它們包裝在陣列中。假設這些行包含 `{"level":"info"}`、`{"level":"warn"}` 和 `{"level":"error"}`。面向行的驗證器會解析三個單獨的輸入,並如果其中缺少引號或尾隨逗號,則可以識別準確的記錄。

為了進行嚴格的整個檔案檢查,請將範例轉換為 `[{"level":"info"},{"level":"warn"},{"level":"error"}]`。括號建立一個根,逗號界定其元素。不要只用逗號替換換行符:這會產生由標點符號分隔的三個根,除非添加了周圍的數組,並它可能會錯誤地處理來源約定可能禁止或忽略的空白行。

两種形状之間的轉換

在兩種形狀之間進行轉換-何時適合包裝陣列以及何時會破壞行分隔輸出的點。用於 API 請求、編輯器或嚴格驗證器的有限導出通常可以成為陣列。轉換必須先解析每個記錄,因為文字連接無法安全地考慮嵌入的轉義字元或無效行。

保留 JSON 行。將多 GB 事件流轉換為陣列需要保留容器狀態並延遲完整解析,直到右括號到達。另一方面,將每個數組元素緊密地序列化在一行上,並定義是否允許空行或最終換行符。

這不包括什麼

這不包括什麼 - 連接 JSON 沒有換行符和記錄分隔符號框架(RFC 7464),這需要專用的解析器。直接放在一起的值無法透過簡單的行操作安全地拆分,尤其是當根可能是數字或字串時。 RFC 7464 使用 ASCII 記錄分隔符號來建立 JSON 文字序列,而不是只依賴可見的換行符。

它也不驗證記錄共享的應用程式規則。解析每一行並不能證明時間戳記是有序的、標識符是唯一的或所有物件都使用相同的模式。這些檢查屬於記錄框架和語法解析之後。同樣,嵌入換行符作為轉义序列` ` 字串內部是資料,而不是物理邊界,而相容的行讀取器必須保留這種差異。

重點:知道你持有哪種形狀

重點:知道您所持有的形狀 - 以及驗證器的位置如何立即告訴您檔案是行分隔的。完整的第一行值之後第二行的第一個標記處的失敗強烈表示存在多個框架記錄,而不是第一筆記錄中的語法損壞。在更改資料之前檢查擴充功能、生產者檔案和預期消費者。

當有意換行時,使用 JSON 行或 NDJSON 解析器獨立驗證記錄。當目標需要一個完整的 JSON 集合時,請使用陣列。 ToolAcre 正確拒絕多根檔案,因為它的契約是嚴格的單文字驗證;拒絕保護該合同,而不是表明換行符分隔的 JSON 本質上有缺陷。將驗證器與帧格式相匹配。