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

时间:2018-10-30 17:47:10

标签: mysql json jsonpath

如果我具有以下JSON数据:

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

我想找到一个返回“第一个”提供者(即abc123)的令牌的JSON路径。问题在于找到“第一个”,因为providers是一个对象,而不是数组。

我想我可以从$.providers.*开始,它返回以下数组:

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

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

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

3 个答案:

答案 0 :(得分:1)

您需要使用提供的表/子查询来解析所需的部分。

  

是的,除了我不知道abc是第一个提供者。

这将解析出第一个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

答案 1 :(得分:0)

(params) => `${this.name} is friends with ${el}`;

一组1行(0.0008秒)

您的路径是provider.abc.provider

答案 2 :(得分:0)

我最终像这样解决了它(使用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;