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

Extract first element of calculated JSONpath response

如果我有以下JSON数据:

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

我想找到 JSON 路径,returns "first" 提供商的令牌,即 abc123。问题在于找到 "first",因为 providers 是一个对象,而不是数组。

我想我可以从 $.providers.* 开始,其中 returns 以下数组:

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

但我似乎无法对该数组做任何事情。例如$.providers.*[0] 无效。

我所要求的可能吗? (如果重要的话,我正在为此使用 MySQL,尽管我正在寻找通用的 JSONPath 解决方案。)

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

一组中的 1 行(0.0008 秒)

你的路径是providers.abc.provider

您需要使用交付tables/subqueries来解析出您需要的部分。

Yes, except I don't know that abc is the first 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"                                       |

demo

我最终是这样解决的(使用 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;