提取计算出的jsonpath响应的第一个元素

oug3syen  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(545)

如果我有以下json数据:

  1. {
  2. "providers": {
  3. "abc": {
  4. "provider": "foo",
  5. "token": "abc123"
  6. },
  7. "def": {
  8. "provider": "bar",
  9. "token": "def567"
  10. }
  11. }
  12. }

我想找到一个返回“first”提供者的令牌的json路径,即。 123 . 问题在于找到“第一个”,因为 providers 是对象,不是数组。
我想我可以从 $.providers.* 返回以下数组:

  1. [
  2. {
  3. "provider": "foo",
  4. "token": "abc123"
  5. },
  6. {
  7. "provider": "bar",
  8. "token": "def567"
  9. }
  10. ]

但我似乎对那个阵列无能为力。例如。 $.providers.*[0] 不起作用。
我的要求可能吗(如果有必要的话,我会使用mysql来实现这一点,尽管我正在寻找一个通用的jsonpath解决方案。)

a6b3iqyw

a6b3iqyw1#

  1. select doc->>"$.providers.abc.provider" from x1;
  2. +----------------------------------+
  3. | doc->>"$.providers.abc.provider" |
  4. +----------------------------------+
  5. | foo |
  6. +----------------------------------+

一行一组(0.0008秒)
您的路径是providers..provider

nzrxty8p

nzrxty8p2#

您需要使用传递的表/子查询来解析出所需的部分。
是的,只是我不知道是第一家供应商。
这将解析出第一个provider元素。。
查询

  1. SELECT
  2. *
  3. , records_json_array.json_array->'$[0].token'
  4. FROM (
  5. SELECT
  6. records.json->'$.providers.*' AS json_array
  7. FROM (
  8. SELECT
  9. '{
  10. "providers": {
  11. "abc": {
  12. "provider": "foo",
  13. "token": "abc123"
  14. },
  15. "def": {
  16. "provider": "bar",
  17. "token": "def567"
  18. }
  19. }
  20. }' AS json
  21. FROM
  22. DUAL
  23. ) AS records
  24. ) AS records_json_array

结果

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

演示

展开查看全部
jvlzgdj9

jvlzgdj93#

我最终解决了这个问题(使用mysql 5.7,这就是为什么我没有 ->> 语法):

  1. SET @j = '{
  2. "providers": {
  3. "abc": {
  4. "provider": "foo",
  5. "token": "abc123"
  6. },
  7. "def": {
  8. "provider": "bar",
  9. "token": "def567"
  10. }
  11. }
  12. }';
  13. SELECT JSON_UNQUOTE(
  14. JSON_EXTRACT(
  15. JSON_EXTRACT(@j, "$.providers.*"),
  16. "$[0].token"
  17. )
  18. ) AS token;
展开查看全部

相关问题