jq:错误无法使用字符串索引字符串。如何使用jq解析具有可变对象值的json文件

时间:2019-03-07 13:38:25

标签: arrays json parsing object jq

我有一个看起来像json的文件:

[
{"start": "xxx", "final": {"name": "uuu", "content": "{'Date': 'Thu, 07 Mar 2019', 'Type': 'text'}"}},
{"start": "yyy", "final": {"name": "nnn", "content": "{'Date': 'Thu, 07 Mar 2019'}"}}
]

"final"包含一个包含两个键的对象:namecontentcontent值是一个对象。它可能为空,并且可能包含不同的键。

但是,我对某些出现在content中的键感兴趣。在此示例中,如果包括“类型”,我想对其进行解析。如果没有,只需插入“未找到”。

运行此jq命令时,出现此错误:

jq: error (at <stdin>:4): Cannot index string with string "Type"

这是因为我的json文件中的第二个对象不包含Type

有没有解决这个问题的方法?

cat test.json | jq -r '.[] | "\(.start),\(.final["name"]),\(.final["content"]["Type"])"'
jq: error (at <stdin>:4): Cannot index string with string "Type"

1 个答案:

答案 0 :(得分:1)

由于map(.final.content |= (gsub("'";"\"") | fromjson)) | .[] | "\(.start),\(.final["name"]),\(.final["content"]["Type"])" 无法直接处理“ content”字段的值,因此以下解决方案首先将单引号转换为转义的双引号,然后应用过滤器:

xxx,uuu,text
yyy,nnn,null

使用-r命令行选项输出:

@csv

CSV

如果您想获得有效的CSV输出,最好使用.[] | .final.content |= (gsub("'";"\"") | fromjson) | [.start, .final["name"], .final["content"]["Type"]] | @csv 过滤器:

jq -r -f program.jq test.json

调用

将jq程序保存在文件中,例如program.jq,相应的调用将如下所示:

//

变化

如果您要专门处理缺失值,可以使用(.final["content"]["Type"] // "NA") ,例如:

.final.content |= (gsub("\"";"\\\"") | gsub("'";"\"") | fromjson)

处理嵌入式双引号

my_array = ['€110.5M', '€111.5M', '€112.5M']
my_cleaned_array = []

for elem in my_array:
    my_cleaned_array.append(elem.replace('€', '').replace('M', ''))