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

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

如果我有以下json数据:

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

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

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

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

a6b3iqyw

a6b3iqyw1#

select doc->>"$.providers.abc.provider" from x1;
+----------------------------------+
| doc->>"$.providers.abc.provider" |
+----------------------------------+
| foo                              |
+----------------------------------+

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

nzrxty8p

nzrxty8p2#

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

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"                                       |

演示

jvlzgdj9

jvlzgdj93#

我最终解决了这个问题(使用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;

相关问题