首页 > 解决方案 > 从 JMESPath 表达式中删除方括号

问题描述

我有以下 JSON:

{
    "694992": [
        {
            "domain": "example.com",
            "domain_id": 49392164,
            "data": [
                {
                    "category": "Main",
                    "category_id": 77133,
                    "data": [
                        {
                            "keyword": "sofort",
                            "key_id": 25963217,
                            "data": {
                                "9242": [
                                    27,
                                    "https://www.example.com/sofort",
                                    false,
                                    false,
                                    1
                                ]
                            }
                        },
                        {
                            "keyword": "das",
                            "key_id": 32325213,
                            "data": {
                                "9242": [
                                    23,
                                    "https://www.example.com/das",
                                    false,
                                    false,
                                    1
                                ]
                            }
                        },
                        {
                            "keyword": "wiki",
                            "key_id": 32325317,
                            "data": {
                                "9242": [
                                    44,
                                    "https://www.example.com/wiki",
                                    false,
                                    false,
                                    1
                                ]
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

使用 JMESPath 表达式,我想从 JSON 中提取一些数据并以下列形式获取:

+---------+--------+--------------------------------+
| Keyword | Number | URL                            |
+---------+--------+--------------------------------+
| sofort  | 27     | https://www.example.com/sofort |
+---------+--------+--------------------------------+
| das     | 23     | https://www.example.com/das    |
+---------+--------+--------------------------------+
| wiki    | 44     | https://www.example.com/wiki   |
+---------+--------+--------------------------------+

我使用以下 JMESPath 表达式:

*[].data[].data[].{Keyword: keyword, Number: data.*[0], URL: data.*[1]}

但我的输出就像

+---------+--------+----------------------------------+
| Keyword | Number | URL                              |
+---------+--------+----------------------------------+
| sofort  | [27]   | [https://www.example.com/sofort] |
+---------+--------+----------------------------------+
| das     | [23]   | [https://www.example.com/das]    |
+---------+--------+----------------------------------+
| wiki    | [44]   | [https://www.example.com/wiki]   |
+---------+--------+----------------------------------+

如何从数字和 URL 中删除方括号?

标签: jmespath

解决方案


发生这种情况是因为*indata.*可能返回多个值,例如来自:

{
    "keyword": "wiki",
    "key_id": 32325317,
    "data": {
        "9242": [
            44,
            "https://www.example.com/wiki",
            false,
            false,
            1
        ],
        "9243": [
            44,
            "https://www.example.com/wiki",
            false,
            false,
            1
        ]
    }
}

这是一个完全有效的 JSON。

如果您确定您data将始终只包含一个元素,则可以使用管道表达式:|停止投影并帮助您从数组中提取第一个元素。

从文档中:

管道表达式对于停止投影很有用。它们也可用于对表达式进行分组。

来源:https
://jmespath.org/examples.html#pipes这个例子也说明了这一点:https ://jmespath.org/examples.html#working-with-nested-data

所以你的表达最终是:

*[].data[].data[].{Keyword: keyword, Number: data.*[0] | [0], URL: data.*[1] | [0]}

这给出了预期:

[
  {
    "Keyword": "sofort",
    "Number": 27,
    "URL": "https://www.example.com/sofort"
  },
  {
    "Keyword": "das",
    "Number": 23,
    "URL": "https://www.example.com/das"
  },
  {
    "Keyword": "wiki",
    "Number": 44,
    "URL": "https://www.example.com/wiki"
  }
]

推荐阅读