我有一些 JSON 数据,我想使用 JQ 对其进行编辑。
- 这是一个人员列表。
- 每个人可以拥有一部或多部
手机
。 - 每个
手机
都有一个号码
(显然是唯一的)和没有。进行的通话
。 - 人们还可以跟踪
总
次通话(他们拥有的每部手机的通话总和)
我尝试在这里使用自解释变量。如果数据不够清晰,请告诉我。
[
{
"name": "Person1",
"mobiles": [{
"number": "11111",
"calls": 2
},{
"number": "22222",
"calls": 3
}],
"total": 5
},
{
"name": "Person2",
"mobiles": [{
"number": "33333",
"calls": 1
},{
"number": "44444",
"calls": 2
},{
"number": "55555",
"calls": 1
}],
"total": 4
}
]
我想要的是,给定一个手机号码和号码。特定一天对该手机调用的电话数量,更新 json(更新单个计数器和总数)
例如。假设进行的 444444
调用次数为 5,那么最终的 json 应该是
[
{
"name": "Person1",
"mobiles": [{
"number": "11111",
"calls": 2
},{
"number": "22222",
"calls": 3
}],
"total": 5
},
{
"name": "Person2",
"mobiles": [{
"number": "33333",
"calls": 1
},{
"number": "44444",
"calls": 7 // previous value was 2, added 5 more
},{
"number": "55555",
"calls": 1
}],
"total": 9 // previous total was 4, added 5 more
}
]
到目前为止我已经尝试过
我可以更新总
个调用,但无法更新给定号码的单个调用
map(select(.mobiles[].number == "44444").total = .total + 5)
给出
[
{
"name": "Person1",
"mobiles": [
{
"number": "11111",
"calls": 2
},
{
"number": "22222",
"calls": 3
}
],
"total": 5
},
{
"name": "Person2",
"mobiles": [
{
"number": "33333",
"calls": 1
},
{
"number": "44444",
"calls": 2 // How do I update this
},
{
"number": "55555",
"calls": 1
}
],
"total": 9 // This is correct
}
]
最佳答案
要按照您正在探索的方式更新相关“调用”:
map( (.mobiles[] | select(.number == $number) | .calls) += $incr)
其中 $number 和 $incr 的值可以(例如)在命令行上指定,例如
jq --arg number 44444 --argjson incr 5 -f update.jq input.json
要更新相关的“总计”,您可以使用 any/2
:
map( if any(.mobiles[]; .number == $number)
then .total += $incr
else .
end)
您可以将这两个过滤器链接在一起,无论是字面意思,还是通过将两个过滤器组合成一个map
(可能更有效)。为了可读性和可维护性,您可能还需要定义辅助函数(即使用 def
)。
关于json - 如何使用JQ更新JSON并获取更新后的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43158831/