从维基数据中,我得到以下 json:
# Sparql query
query=$(cat ./myquery.sparql)
response=$(curl -G --data-urlencode query="${query}" https://wikidata.org/sparql?format=json)
echo "${response}" | jq '.results.bindings'
[
{
"language": {
"type": "uri",
"value": "https://lingualibre.org/entity/Q100"
},
"wikidata": {
"type": "literal",
"value": "Q36157"
},
"code": {
"type": "literal",
"value": "lub"
}
},
{
"language": {
"type": "uri",
"value": "https://lingualibre.org/entity/Q101"
},
"wikidata": {
"type": "literal",
"value": "Q36284"
},
"code": {
"type": "literal",
"value": "srr"
}
}
]
我希望将键与其值直接配对,例如:
[
{
"language": "https://lingualibre.org/entity/Q100",
"wikidata": "Q36157",
"iso": "lub"
},
{
"language": "https://lingualibre.org/entity/Q101",
"wikidata": "Q36284",
"iso": "srr"
}
]
我目前有一个非弹性代码,只要键名称发生更改,该代码就会中断:
jq 'map({"language":.language.value,"wikidata":.wikidata.value,"iso":.code.value})'
如何以弹性方式将键与其值配对(不命名键)? 我想“修剪”子对象,以便只保留值。
最佳答案
您可以使用 map_values
,它的工作方式类似于外部 map
但对于对象,即它保留对象结构,包括字段名称:
jq 'map(map_values(.value))'
[
{
"language": "https://lingualibre.org/entity/Q100",
"wikidata": "Q36157",
"code": "lub"
},
{
"language": "https://lingualibre.org/entity/Q101",
"wikidata": "Q36284",
"code": "srr"
}
]
请注意,此解决方案缺少从 code
到 iso
的名称转换。
关于jq - 使用 JQ 简化带有子对象的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75296612/