Извлечь первый элемент рассчитанного ответа JSONpath - PullRequest
0 голосов
/ 30 октября 2018

Если у меня есть следующие данные JSON:

{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}

Я бы хотел найти путь JSON, который возвращает токен «первого» провайдера, т.е. abc123. Проблема заключается в поиске «первого», поскольку providers является объектом, а не массивом.

Я думал, что могу начать с $.providers.*, который возвращает следующий массив:

[
  {
    "provider": "foo",
    "token": "abc123"
  },
  {
    "provider": "bar",
    "token": "def567"
  }
]

Но я не могу ничего сделать с этим массивом. например $.providers.*[0] не работает.

Возможно ли то, что я прошу? (Если это имеет значение, я использую MySQL для этого, хотя я ищу общее решение JSONPath.)

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вам нужно использовать поставленные таблицы / подзапросы, чтобы разобрать нужную часть.

Да, за исключением того, что я не знаю, что abc является первым провайдером.

Это анализирует первый элемент провайдера.

Запрос

SELECT 
 *
 , records_json_array.json_array->'$[0].token'
FROM (

SELECT 
 records.json->'$.providers.*' AS json_array
FROM (

SELECT 
 '{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}' AS json
FROM 
 DUAL
) AS records

) AS records_json_array

Результат

| json_array                                                                       | records_json_array.json_array->'$[0].token' |
| -------------------------------------------------------------------------------- | ---------------------------------------------- |
| [{"token": "abc123", "provider": "foo"}, {"token": "def567", "provider": "bar"}] | "abc123"                                       |

демо

0 голосов
/ 01 ноября 2018

В итоге я решил это так (используя MySQL 5.7, поэтому у меня нет синтаксиса ->>):

SET @j = '{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}';



SELECT JSON_UNQUOTE(
  JSON_EXTRACT(
    JSON_EXTRACT(@j, "$.providers.*"),
    "$[0].token"
  )
) AS token;
0 голосов
/ 30 октября 2018
select doc->>"$.providers.abc.provider" from x1;
+----------------------------------+
| doc->>"$.providers.abc.provider" |
+----------------------------------+
| foo                              |
+----------------------------------+

1 строка в наборе (0,0008 с)

Ваш путь - provider.abc.provider

...