【问题标题】:JQ to parse nested arraysJQ解析嵌套数组
【发布时间】:2019-01-02 02:15:40
【问题描述】:

我在从 JSON 获取数据时遇到问题:

{
  "operations": [
    {
      "operationName": "GetValue",
      "batch_size": "2",
      "orders": [
        {
          "clientId": "7836",
          "validation_time": {
            "place": "136",
            "execute": "5379"
          }
        },
        {
          "clientId": "7837",
          "validation_time": {
            "place": "145",
            "execute": "5401"
          }
        }
      ]
    },
    {
      "operationName": "GetValue",
      "batch_size": "3",
      "orders": [
        {
          "clientId": "7838",
          "validation_time": {
            "place": "122",
            "execute": "5201"
          }
        },
        {
          "clientId": "7839",
          "validation_time": {
            "place": "122",
            "execute": "5201"
          }
        },
        {
          "clientId": "7840",
          "validation_time": {
            "place": "122",
            "execute": "5201"
          }
        }
      ]
    }
  ]
}

因此,我想获取每个订单的信息,包括 clientId 作为键,place_validation_time 和 execute_validation_time 每个订单。我尝试了以下方法:

.operations[] | select(.operationName=="GetValue") | {key: .orders[].clientId, place_validation_time: .orders[].validation_time.place, execute_validation_time: .orders[].validation_time.execute, batch_size: .batch_size}

但它对我来说有一个意想不到的结果,它将所有 clientId 与validation_time.place 和validation_time.execute 的所有变体结合在一起,所以我得到了4 个(对于batch_size=2)而不是每个订单1 个对象,例如 预期:

{
  "key": "7836",
  "place_validation_time": "136",
  "execute_validation_time": "5379",
  "batch_size": "2"
}

实际我有:

{
  "key": "7836",
  "place_validation_time": "136",
  "execute_validation_time": "5379",
  "batch_size": "2"
}
{
  "key": "7836",
  "place_validation_time": "136",
  "execute_validation_time": "5401",
  "batch_size": "2"
}
{
  "key": "7836",
  "place_validation_time": "145",
  "execute_validation_time": "5379",
  "batch_size": "2"
}
{
  "key": "7836",
  "place_validation_time": "145",
  "execute_validation_time": "5401",
  "batch_size": "2"
}

有人知道如何避免它并因此每 1 个订单获得 1 个对象吗?

【问题讨论】:

    标签: arrays json scope nested jq


    【解决方案1】:

    笛卡尔积行为是在对象构造表达式内的多个位置包含.orders[] 的结果。而是将其吊起。假设你想选择.batch_size等于“2”的对象,你可以这样写:

    .operations[]
    | select(.operationName=="GetValue")
    | .batch_size as $batch_size
    | select($batch_size == "2")
    | .orders[]
    | {key: .clientId,
       place_validation_time: .validation_time.place,
       execute_validation_time: .validation_time.execute,
       batch_size: $batch_size}
    

    附录

    如果您在 .batch_size 级别有其他感兴趣的项目,您可能希望使用更像这样的过滤器:

    .operations[]
    | select(.operationName=="GetValue")
    | . as $it
    | select($it.batch_size == "2")
    | .orders[]
    | {key: .clientId,
       place_validation_time: .validation_time.place,
       execute_validation_time: .validation_time.execute,
       batch_size: $it.batch_size}
    

    【讨论】:

    • 非常感谢!我会尝试,如果在 batch_size 级别上有很多测量值,我应该如何编写脚本? "| .batch_size 作为 $batch_size,.batch_size1 作为 $batch_size1 | " 不起作用
    • jq 是基于管道的,所以你可以写.x as $x | .y as $y;但是,如果您有两个或三个以上的此类变量,则可能有更好的选择。例如。使用 JSON 对象。见jq手册
    • 实际上,它是其中的 3 个,我尝试像 | .batch_size as $batch_size | .batch_size1 as $batch_size1 | 一样使用管道,但在我的情况下它导致语法错误 jq: error: syntax error, unexpected FIELD, expecting '|' (Unix shell quoting issues?) at <top-level>,
    • 解决了,我不应该在变量名中使用.,现在已经很明显了。 @peak 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2021-05-06
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多