Удалите квадратные скобки из выражения 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?


person Evgeniy    schedule 04.11.2020    source источник


Ответы (1)


Это могло произойти, потому что * в data.* может возвращать несколько значений, например из:

{
    "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"
  }
]
person β.εηοιτ.βε    schedule 04.11.2020