当前位置: 首页 > 面试题库 >

使用jq更新字典数组中的一个值

韦胜泫
2023-03-14
问题内容

我想更新一个字典中的值,该值只能由字典中的另一个值来标识。也就是说,鉴于此输入:

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "zip",
    "id": "baz"
  }
]

我想将baz伴随格式更改为“ csv”:

[
  {
    "format": "geojson",
    "id": "foo"
  },
  {
    "format": "geojson",
    "id": "bar"
  },
  {
    "format": "csv",
    "id": "baz"
  }
]

我发现这可行:

jq 'map(if .id=="baz" then .format="csv" else . end)' my.json

但这似乎很冗长,所以我想知道是否有一种更优雅的方式来表达这一点。jq似乎缺少某种表达式选择器,等效[@id='baz']于xpath。

(当我开始这个问题时,我[.[] |...]发现了map,所以并没有我想的那么糟。)


问题答案:

您要寻找的是一项复杂的任务:

jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json

也许不短,但是根据要求它更优雅。请参阅以下文档的最后一部分:http
:
//stedolan.github.io/jq/manual/#Assignment

编辑:使用map

jq 'map((select(.id == "baz") | .format) |= "csv")' my.json


 类似资料:
  • 问题内容: 如果我忽略了一些很明显的东西,就可以选择应用程序;我刚刚找到了并且正在尝试使用它来更新一个JSON值而不影响周围的数据。 我想将结果传送到,更新值,然后将更新的JSON传送到。就像是 到目前为止,我已经使用一起破解了它,但是在查看了一些运算符示例之后,我确定我不需要这些。 这是一个JSON示例- 在保留其余JSON的同时,如何使用set ? 问题答案: 您可以使用运算符设置对象的值。

  • 行动时刻 - 更新MikroTik词典 Isaac给他的朋友发了电子邮件,通知他有关配置损坏的信息。 然后他的朋友回复并指示Isaac访问以下URL,其中显示了MikroTik支持的最新RADIUS属性: http://wiki.mikrotik.com/wiki/Manual:RADIUS_Client 虽然网页的内容最初有点令人困惑,但Isaac设法执行以下操作以修复其FreeRADIUS服务

  • 下图是三组相互接触的方块,每个方块都有编号。 我已经能够使用空间库ArcPy构建下面的字典,它使用平方数作为键,并使用它所触及的平方的数字列表作为值。例如,正方形1只接触正方形4,正方形4接触正方形1和6,依此类推。 从图中可以清楚地看到,有三组相互接触的正方形,所以我想要的结果是一个新的字典,其中的键是正方形的数字,值是它所属的接触组。我将使用字母命名接触组,但这些名称可以是任何名称,因此一个可

  • 我有一系列推车。我想更新请求对象中的产品数量。即。 我有一个数组的产品和数量,比如: 我想更新它们,如: 这可能的逻辑是什么?

  • 问题内容: 我有这个文件: 如果我运行以下更新: 我得到了不好的结果: 这是错误的,因为 “ something”:“ test” 应该在第二个元素中,映射等于2。 如果我将字段 “名称” 更改为 “ a” 并运行相同的更新,则得到正确的结果: 现在您可以看到 “ something”:“ test” 在正确的位置(第二个事件)。这是因为我在Mongo中使用了 “名称” 而 “名称” 是某种保留关

  • 尝试更新列中嵌套数组的所有元素,但只更新了一个元素。我的查询: 请参阅带有示例值的演示: 分贝 我无法理解为什么此查询会更新数组中的第一个对象: 但不是后续的: