简体中文

开发者工具 · 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 本质上有缺陷。将验证器与帧格式相匹配。