对JSON输入的合法更改会使简单的jq无效

时间:2018-06-11 21:05:10

标签: json jq

另一个部门不断更新我随后查询的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专家有什么明显的事情?

唉,我不会保留旧版本的文件进行比较。 (我想我今天会开始。)

1 个答案:

答案 0 :(得分:0)

(经过一番调查后自我回答)

我认为输入中没有格式错误或格式更改。

我不知道为什么我的查询语法之前遇到错误(也许我只是没注意到),但似乎“食谱”部分中的条目通常不包含“l”属性,jq会在遇到没有属性的情况下立即停止处理。

我也不知道为什么jq没有为缺少该属性的每个记录生成相同的错误消息,也不知道为什么它等待输入的最后一行生成单个消息。 (也许这种行为记录在某处。)

无论如何,我首先通过测试属性的存在来修复错误(不仅是消息,还有未显示所有相关记录):

jq '.["recipes"][] | select(has("l") and (.l | test("ill")))' < jsonfile