【问题标题】:JMESPath query for nested array structures嵌套数组结构的 JMESPath 查询
【发布时间】:2019-05-27 07:36:38
【问题描述】:

由于 aws logs get-query-results,我有以下数据结构:

    {
    "status": "Complete", 
    "statistics": {
        "recordsMatched": 2.0, 
        "recordsScanned": 13281.0, 
        "bytesScanned": 7526096.0
    }, 
    "results": [
        [
            {
                "field": "time", 
                "value": "2019-01-31T21:53:01.136Z"
            }, 
            {
                "field": "requestId", 
                "value": "a9c233f7-0b1b-3326-9b0f-eba428e4572c"
            }, 
            {
                "field": "logLevel", 
                "value": "INFO"
            }, 
            {
                "field": "callerId", 
                "value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
            }
        ],
        [
            {
                "field": "time", 
                "value": "2019-01-25T13:13:01.062Z"
            }, 
            {
                "field": "requestId", 
                "value": "a4332628-1b9b-a9c2-0feb-0cd4a3f7cb63"
            }, 
            {
                "field": "logLevel", 
                "value": "INFO"
            }, 
            {
                "field": "callerId", 
                "value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
            }
        ],
      ]
    }

AWS CLI 支持用于过滤输出的 JMESPath 语言。我需要应用一个查询字符串,在返回的“结果”中过滤包含“callerId”作为“字段”的对象,检索“value”属性并获得以下输出:

    [
      {
       callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
      },
      {
       callerId: "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
      }
    ]

我要做的第一步是使用查询字符串来平整结果数组:results[]

这将读取其他根属性(状态、统计信息)并仅返回一个包含所有 {field: ..., value: ...} 类似对象的大数组。但在此之后,我无法正确过滤那些匹配 field=="callerId" 的对象。除其他外,我尝试了以下表达式但没有成功:

'results[][?field=="callerId"]'
'results[][*][?field=="callerId"]'
'results[].{ callerId: @[?field=="callerId"].value }'

我不是 JMESPath 方面的专家,我正在学习 jmespath.org 网站的教程,但无法使其正常工作。

谢谢!

【问题讨论】:

  • 删除最后一个逗号,如果你把你的 json 放在 JMES 路径测试器中,代码将不起作用

标签: arrays json multidimensional-array aws-cli jmespath


【解决方案1】:

使用 jq 是一件好事,因为它是更完整的语言,但如果你想使用 JMES Path 来做,这里的解决方案:

results[*][?field=='callerId'].{callerId: value}[]

得到:

[
  {
    "callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
  },
  {
    "callerId": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
  }
]

【讨论】:

    【解决方案2】:

    我无法完全重现,因为我的日志流中没有相同的日志,但我能够使用 jq 并将示例 JSON 对象放入文件中来做到这一点

    cat sample_output.json | jq '.results[][] | select(.field=="callerId") | .value'

    输出

    "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
    "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
    

    您可以将 aws cli 的输出通过管道传输到 jq。

    我能够非常接近本机 JMESPath 查询并使用此站点中的内置编辑器 http://jmespath.org/examples.html#filtering-and-selecting-nested-data

    results[*][?field==`callerId`][]
    

    输出

    [
      {
        "field": "callerId",
        "value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
      },
      {
        "field": "callerId",
        "value": "a9b0f9c2-eb42-3986-33f7-8e450b1b72cf"
      }
    ]
    

    但我不知道如何让callerId 成为键,而值成为另一个键的值。

    【讨论】:

    • 感谢@jmp,在某些时候我得到了一些非常相似的东西,但不幸的是,要求只要求我提供 JMESPath。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2015-08-14
    • 2022-01-13
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多