Watch at Ease看见世界,读懂生活。

科技 · 实用指南

jq 提示 cannot index string with string?修改过滤器前先证明 JSON 形状

保存 jq 输入模式和每一步路径的类型,只对已证明的混合形状边界加守卫,并保留所有拒绝记录。

zh-CN jq JSON path type diagram
原创编辑插画: prove the value type before indexing. Watch at Ease

jq 用对象键索引字符串、数组、数字或布尔值时会失败。更危险的是,生成器可能先输出有效值,再在另一类型上失败,于是留下部分输出和非零退出码。

保存原始字节、输入模式和准确过滤器。建立路径—类型台账;若是结构漂移就失败关闭,若确为混合集合才做窄守卫并保留拒绝项。

冻结字节、输入模式与过滤器

先保存代表性输入文件,记录 jq --version、完整过滤器、shell quoting、上游命令和 -R、-s、-n。-R 会产生字符串,-s 会产生数组。

验证保存文件是 JSON,并把失败记录与成功记录并排保留。先输出一行再以 5 退出仍然是失败。

建立路径和类型台账

在根和每个遍历步骤运行 type。RFC 8259 独立定义对象与数组,而且数组元素不必同型。

记录路径、观察类型和数量。对对象执行 .[] 会产生所有成员值,之后的 .name 可能落到字符串或布尔值上。

区分三类形状故障

常见错误包括过早展开根对象、混合集合,以及外观像 JSON 的字符串。第三种情况在解析前需要来源判断。

不要把 echo 后的文本当权威字节;quoting 可能改变内容。直接读取保存文件并与生产者 schema 对照。

只守卫已证明的边界

若集合合法混型,先选 type==object 再读键,并把其他值连同路径和类型写入拒绝台账。

宽泛 try、catch 或 optional 可能用空输出隐藏错误。只有当非对象是合同允许值且拒绝数仍被计量时才能用。

要求输出、拒绝与退出证明

测试对象、数组、字符串、布尔、null、缺失键和混合数组。让接受数与拒绝数和输入基数对账,并断言退出码。

完成条件是输入模式清晰、路径类型稳定、输出数量符合预期、无未解释拒绝,而且必需对象变标量时会失败。

zh-CN jq narrow guard and reject ledger diagram
原创编辑插画: guard narrowly and keep rejected records visible. Watch at Ease