【问题标题】:Preserve hierarchy in JMESPath query在 JMESPath 查询中保留层次结构
【发布时间】:2017-11-03 07:51:20
【问题描述】:

查询某些文档时,我想在层次结构中选择项目,但在结构中保留父名称。例如在查询 aws 数据库成员时,我可以使用:

DBClusters[].DBClusterMembers[].[DBInstanceIdentifier,IsClusterWriter]

从:

{
    "DBClusters": [
        {
            "DatabaseName": "bazbar",
            "DBClusterMembers": [
                {
                    "IsClusterWriter": false,
                    "DBClusterParameterGroupStatus": "in-sync",
                    "PromotionTier": 2,
                    "DBInstanceIdentifier": "foobar"
                },
    ...

收件人:

[
    [
        "foobar",
        false
    ],
    ...

但是我怎样才能得到以下响应:

{
    "bazbar": [
        [
             "foobar",
             false
        ],
        ...

即对于每个集群,提取DatabaseName 作为成员列表的键名?

【问题讨论】:

    标签: json jmespath


    【解决方案1】:

    上下文

    • Jmespath 查询
    • 如何生成保留对象嵌套的查询
    • 如何生成来自另一个对象键值对的值的动态对象键

    解决方案

    示例

    假设以下示例数据集...

        {
            "dbclusters": [
                {
                    "databasename": "alpha",
                    "dbclustermembers": [
                        {
                            "isclusterwriter": false,
                            "dbinstanceidentifier": "foobar"
                        }
                        ,{
                            "isclusterwriter": true,
                            "dbinstanceidentifier": "doobar"
                        }
                    ]
                }
                ,{
                    "databasename": "bravo",
                    "dbclustermembers": [
                        {
                            "isclusterwriter": false,
                            "dbinstanceidentifier": "foobar"
                        }
                    ]
                }
                ,{
                    "databasename": "charlie",
                    "dbclustermembers": [
                        {
                            "isclusterwriter": false,
                            "dbinstanceidentifier": "foobar"
                        }
                    ]
                }
            ]
        }
    

    ...下面的jmespath查询...

        @.dbclusters[].{"databasename":databasename
            ,"dbclustermembers":[dbclustermembers[*].isclusterwriter
            ,dbclustermembers[*].dbinstanceidentifier][]
            }
    

    ...产生以下结果...

        [
          {
            "databasename": "alpha",
            "dbclustermembers": [
              false,
              true,
              "foobar",
              "doobar"
            ]
          },
          {
            "databasename": "bravo",
            "dbclustermembers": [
              false,
              "foobar"
            ]
          },
          {
            "databasename": "charlie",
            "dbclustermembers": [
              false,
              "foobar"
            ]
          }
        ]
    

    陷阱

    • 此方法不会按照 OP 中的要求将数据库名称作为对象键生成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2020-04-17
      • 2015-10-15
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2016-01-06
      • 2012-08-03
      相关资源
      最近更新 更多