jq - 使用 JQ 简化带有子对象的对象数组

标签 jq sparql wikidata

从维基数据中,我得到以下 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"
  }
]

请注意,此解决方案缺少从 codeiso 的名称转换。

关于jq - 使用 JQ 简化带有子对象的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75296612/

相关文章:

json - 有没有办法获取 JSON 值中特定元素的路径?

使用多个数据源的 SPARQL 查询

sparql - 维基数据结果按类似于 PageRank 的方式排序

sparql - 维基数据 SPARQL 查询返回错误结果

jq - 返回所有具有与条件匹配的子属性的顶级属性键

循环中的 JSON 键和 bash 变量

json - 解析 JSON 和其他字段中的 JSON 字符串

compare - SPARQL - 禁用按字母顺序比较实体 ID

python - 第一次调用 openrdf-sesame 更新端点非常慢。有没有办法优化它?

SPARQL 查询未产生预期结果