如何用 jq 的 --seq 选项读写 application/json-seq 数据流【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq当你要处理的不是一个完整的 JSON 文本而是一条由多个 JSON 文本依次排成的数据流例如逐条记录追加写入的日志流、上游程序持续输出的事件序列时jq 提供了--seq选项它对输入和输出都采用application/json-seq这个 MIME type 方案来分隔 JSON 文本。本文基于 jq 官方手册中--seq选项的说明给出写入 json-seq 流、读取 json-seq 流以及与不带--seq的普通 jq 输出互通的完整操作路径。--seq流的格式约定手册对--seq的定义是输出侧每个输出值之前打印一个 ASCII RSrecord separator记录分隔符字符每个输出之后打印一个 ASCII LF换行字符输入侧按同样的方案分隔输入中的各个 JSON 文本解析失败处理解析失败的输入 JSON 文本会被忽略但会给出警告并丢弃从该处到下一个 RS 之间的所有后续输入然后从下一个 RS 之后继续解析。也就是说一个 json-seq 流在字节层面就是「RS 一个 JSON 文本」的重复序列。jq 源码中也明确了这个分隔字符src/jv_parse.c 中用\036匹配注释标注为ASCII RS。jq --help对该选项的说明同样是 parse input/output as application/json-seq见 src/main.c。记住这两条规则RS 前置、LF 收尾坏记录告警并跳到下一个 RS后面写入和读取的验证都以此为判定依据。写入生成 application/json-seq 输出流把--seq加在任意 jq 程序上输出就从「每个值一行 JSON」变成「每个值带 RS/LF 定界的 json-seq 格式」。以手册中出现的示例值[0,[1,{a:1},{b:2}]]为输入示例数据printf %s [0,[1,{a:1},{b:2}]] | jq --seq .输入本身可以仍是普通 JSON 文本--seq只改变 jq 输出各值之间的定界方式。输出的每个值前面会有一个 ASCII RS 字符后面跟换行可直接重定向保存为.jsonseq文件供后续流式读取printf %s [0,[1,{a:1},{b:2}]] | jq --seq . stream.jsonseq读取处理已有的 json-seq 数据流处理.jsonseq文件时输入和输出都加上--seqjq --seq . stream.jsonseqfilter 部分就是普通 jq 程序如字段选取、条件过滤jq 会把流中的每个 JSON 文本依次作为输入逐个过滤。坏记录的行为是可预期的按手册说明某个 JSON 文本解析失败时jq 会发出警告写到 stderr丢弃到下一个 RS 为止的输入然后继续处理后续记录不会中断整个流。如果你在 stderr 看到解析警告这属于--seq模式的既定行为而不是命令执行失败——判定标准是后续记录是否仍被正常输出。与普通 jq 输出互通--seq的输入解析是普通 JSON 输出的超集手册明确写道This mode also parses the output of jq without the--seqoption。因此可以把不带--seq的 jq 输出直接喂给带--seq的 jq例如把一段多行 JSON 重新定界成 json-seq 流jq . input.json | jq --seq .这一条用于格式转换左侧产生普通 JSON 文本右侧按--seq的定界规则重新打包输出。结果验证方式按前文的格式约定核对三步即可定界检查--seq输出的每个值前应有 ASCII RS\036字符、值后有 LF可用任意十六进制查看工具检查输出文件的前几个字节是否为0x1E互通检查jq . x.json | jq --seq .应能把普通 JSON 输出转成带 RS 定界的流证明输入解析兼容坏记录检查向流中混入一段非法 JSON预期结果是 stderr 出现警告、该记录被跳过且下一个 RS 之后的记录仍被正常输出。与--stream组合的边界手册 Streaming 一节提到用--stream时 jq 以流式方式解析输入并输出[path, leaf-value]形式同时说明未来版本中同时带--stream和--seq的 jq 在某个输入文本解析失败时可能输出[error message]这样的附加形式。因此如果后续计划把--seq与--stream一起用于超大输入解析失败的表现形式以所用版本的实际输出为准不要假设错误只出现在 stderr。--seq的完整说明见 docs/content/manual/manual.yml 中命令行选项列表的--seq条目以及同文件 Streaming 章节。【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考