【问题标题】:Extract first element of calculated JSONpath response提取计算的 JSONpath 响应的第一个元素
【发布时间】:2018-10-30 17:47:09
【问题描述】:

如果我有以下 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 解决方案。)

【问题讨论】:

  • 你的预期结果是什么?
  • 这个怎么样? db-fiddle.com/f/4tuZLkgdM8C7diD1aVciUj/0你需要使用交付的表来解析它。
  • 预期结果为abc123
  • 我回答了我的示例的更新,即输出“abc123”@Colin

标签: mysql json jsonpath


【解决方案1】:

您需要使用交付的表/子查询来解析出您需要的部分。

是的,但我不知道 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"                                       |

demo

【讨论】:

  • 赞成,因为它有效,尽管我认为添加许多级别的子查询很快就会变得难以管理。特别是如果您想从表中选择 JSON 数据以及其他数据。
【解决方案2】:
select doc->>"$.providers.abc.provider" from x1;
+----------------------------------+
| doc->>"$.providers.abc.provider" |
+----------------------------------+
| foo                              |
+----------------------------------+

集合中的 1 行(0.0008 秒)

你的路径是 providers.abc.provider

【讨论】:

  • 是的,除了我不知道abc 是第一个提供者。
  • 这里更容易遍历一个数组或使用类似下面的东西,只处理第一个 entry.select doc->>"$.providers.*.provider" from x1; +--------------------------------+ | doc->>"$.providers.*.provider" | +--------------------------------+ | [“富”,“酒吧”] | +--------------------------------+ 1 行在集合中(0.0004 秒)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2015-07-20
    • 2019-01-15
    • 2021-06-16
    • 1970-01-01
    相关资源
    最近更新 更多