【问题标题】:How to filter missing inner key by using jq如何使用 jq 过滤丢失的内键
【发布时间】:2019-10-07 10:16:00
【问题描述】:

得到这样的 json 输入:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": "3423.25"
  }
]

第三个对象上没有时间戳。我怎么能返回所有对象上只有一个时间戳。像下面这样:

[ 
{
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322460000,
      "value": "0.0"
    }
  },
  {
    "dimensions": "helloworld",
    "metrics": "sum(is_error)",
    "values": {
      "timestamp": 1558322160000,
      "value": "0.0"
    }
  }
]

非常感谢。

干杯, 文森特

【问题讨论】:

    标签: json filter jq


    【解决方案1】:
    map( select ( .values | has("timestamp")? ))
    

    【讨论】:

    • 感谢 peak,但我收到错误消息“jq: error (at :22): Cannot index string with string "values" exit status 5”。任何想法?见我的 sn-p:jqplay.org/s/B1iS41Gk6t
    • 抱歉,我没有注意到 .values 之一是字符串。请参阅更新以了解另一种选择。
    【解决方案2】:

    这是一个替代解决方案,使用 JSON 的 walk-path unix 工具:jtc

    bash $ <file.json jtc -w'<timestamp>l:[-2]' -j
    [
       {
          "dimensions": "helloworld",
          "metrics": "sum(is_error)",
          "values": {
             "timestamp": 1558322460000,
             "value": "0.0"
          }
       },
       {
          "dimensions": "helloworld",
          "metrics": "sum(is_error)",
          "values": {
             "timestamp": 1558322160000,
             "value": "0.0"
          }
       }
    ]
    bash $ 
    
    • 它找到每个(全部)标签timestamp,然后从找到的 json 条目向上移动 2 级并打印找到的 Json 元素。 -j 将所有打印的步行包装回数组中。

    PS> 披露:我是jtc 工具的创建者

    【讨论】:

      【解决方案3】:

      工作示例: [ .[] | select (.values | has("timestamp")?) ]

      https://jqplay.org/s/n5jsRsPMhW

      或替代: [ .[] | select (.values.timestamp?) ]

      https://jqplay.org/s/HRWV44YgUp

      附: This one 不正确,因为在 .[] 之后您正在分别处理每个项目,而不是数组。所以'map'功能是不必要的。

      【讨论】:

      • 非常感谢 llkiv,这解决了我的问题。非常感谢您告诉我为什么我的尝试不起作用。
      猜你喜欢
      • 2023-01-25
      • 2017-04-16
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多