提取计算出的 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" |
我最终是这样解决的(使用 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;
如果我有以下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" |
我最终是这样解决的(使用 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;