json - 如何使用JQ更新JSON并获取更新后的值

标签 json updates increment jq

我有一些 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/

相关文章:

c++ - 在 for 循环中,就迭代总数而言,循环控制变量的前/后递增之间是否存在差异?

c# - 解析作为 exe C# 输入参数提供的 json 字符串

symfony - PreUpdate 级联实体持久化 symfony 2.3

mysql - 如何使用 CakePHP 更新一行上的多个字段

android - 如何检查已安装的应用程序版本是否已过时

C++ 指针增量查询

c# - 什么 VS 调试器使增量运算符执行得比什么都不做更快?

javascript - 如何修复无限滚动表?

python - 将 JSON 发布到 Flask 会导致 400 Bad Request 错误

python - Py2exe 和 selenium - IOError : [Errno 2] No such file or directory: '\\dist\\main.exe\\selenium\\webdriver\\firefox\\webdriver_prefs.json'