另一个部门不断更新我随后查询的JSON文件。它的格式是三个看起来相似的词典列表:
{
"levels":
[
{"a":1, "b":False, "c":"2012", "d":"2017"}
,{"a":2, "b":True, "c":"2013", "d":"9999"}
,...
]
,"costs":
[
{"e":12, "f":"foo", "g":"blarg", "h":"2015", "i":"2018"}
,{"e":-3, "f":"foo", "g":"glorb", "h":"2013", "i":"9999"}
,...
]
,"recipes":
[
{"j":"BAZ", "k":["blarg","glorb","bleeg"], "l":"dill", "m":"2016", "n":"2017"}
,{"j":"BAZ", "k":["blarg","bleeg"], "l":"dill", "m":"2017", "n":"9999"}
,...
]
} # line 3943 (see below)
最近,我的简单jq
查询如
jq '.["recipes"][] | select(.l | test("ill"))' < jsonfile
停止返回他们应该的所有结果(例如,只返回上面两条“dill”行中的一条)并开始打印此错误消息:
jq: error (at <stdin>:3943): null (null) cannot be matched, as it is not a string
错误中提到的第3943行是文件的最后一行。对文件的“级别”和“成本”部分的查询继续像正常一样工作;它只是文件的“食谱”部分,好像jq
认为文件的右括号仍然是“食谱”部分的一部分。
对我而言,这表明文件的最后一部分中存在格式更改或错误。但是,jq
以外的软件(例如python
)不会报告解析它的任何问题。在我逐行开始输入之前...此错误消息是否表明jq
专家有什么明显的事情?
唉,我不会保留旧版本的文件进行比较。 (我想我今天会开始。)
答案 0 :(得分:0)
(经过一番调查后自我回答)
我认为输入中没有格式错误或格式更改。
我不知道为什么我的查询语法之前不遇到错误(也许我只是没注意到),但似乎“食谱”部分中的条目通常不包含“l”属性,jq
会在遇到没有属性的情况下立即停止处理。
我也不知道为什么jq
没有为缺少该属性的每个记录生成相同的错误消息,也不知道为什么它等待输入的最后一行生成单个消息。 (也许这种行为记录在某处。)
无论如何,我首先通过测试属性的存在来修复错误(不仅是消息,还有未显示所有相关记录):
jq '.["recipes"][] | select(has("l") and (.l | test("ill")))' < jsonfile