MySQL 嵌套JSON解析

MySQL JSON解析技巧
本文介绍MySQL自5.7版本起支持的JSON数据类型及其解析函数json_extract()的使用方法,包括如何获取JSON值、去除引号及进一步解析嵌套JSON。

MySQL自5.7之后开始支持json类型,相应的解析函数主要是json_extract()

查询MySQL版本

select version()

示例
示例json1

未经过转义的json串

{"l1":{"l1_1":["l1_1_1","l1_1_2"],"l1_2":{"l1_2_1":121,"l1_2_2":"122"}},"l2":{"l2_1":null,"l2_2":true,"l2_3":{}}}
示例json2

经过转义后的json串

{"t_key":"haha","t_value":"{\"id\":\"14\",\"timestamp\":1539768556,\"type\":1}","test":2}

通过json_extract()可以获取json里面value对于的值:

mysql> select json_extract(field1, '$.t_key') from table1;
+----------------------------------------+
| json_extract(field1, '$.t_key')        |
+----------------------------------------+
| "haha"                                 |
+----------------------------------------+
1 row in set (0.00 sec)
mysql> select json_extract(field1, '$.t_value') from table1;
+-------------------------------------------------------+
| json_extract(field1, '$.t_value')              |
+-------------------------------------------------------+
| "{\"id\":\"14\",\"timestamp\":1539768556,\"type\":1}" |
+-------------------------------------------------------+
1 row in set (0.00 sec)

如果想去除两侧引号,可以先做类型转换再做trim:

mysql> select trim(both '"' from cast(json_extract(field1, '$.t_value') as char)) from table1;
+----------------------------------------------------------------------------+
| trim(both '"' from cast(json_extract(field1, '$.t_value') as char)) |
+----------------------------------------------------------------------------+
| {\"id\":\"14\",\"timestamp\":1539768556,\"type\":1}                        |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)

如果要在MySQL中对解析后的json再进行解析,则需要加上json_unquote函数以去掉escape character:

mysql> select json_unquote(json_extract(field1, '$.t_value')) from table1; 
+--------------------------------------------------------+
| json_unquote(json_extract(field1, '$.t_value')) |
+--------------------------------------------------------+
| {"id":"14","timestamp":1539768556,"type":1}            |
+--------------------------------------------------------+
1 row in set (0.00 sec)

如果要对解析过后的json继续解析,则在上一步基础上嵌套json_extract()

mysql> select json_extract(json_unquote(json_extract(field1, '$.t_value')), '$.timestamp') from table1;
+-------------------------------------------------------------------------------------+
| json_extract(json_unquote(json_extract(field1, '$.t_value')), '$.timestamp') |
+-------------------------------------------------------------------------------------+
| 1539768556                                                                          |
+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
JSON_UNQUOTE() Special Character Escape Sequences
Escape SequenceCharacter Represented by Sequence
\"A double quote (") character
\bA backspace character
\fA formfeed character
\nA newline (linefeed) character
\rA carriage return character
\tA tab character
\\A backslash () character
\uXXXXUTF-8 bytes for Unicode value XXXX

json_extract的等效操作符是->;
json_unquote(json_extract())的等效操作符是->>;

参考资料1
参考资料2
参考资料3

### MySQL 解析 JSON 数据 在 MySQL 中,`JSON_EXTRACT` 是一种核心函数,用于从 JSON 字符串中提取指定路径的数据[^1]。该函数支持通过路径表达式(Path Expression)来定位 JSON 文档中的具体部分。例如: ```sql SELECT JSON_EXTRACT('{"key": "value"}', '$.key'); -- 输出: "value" ``` #### `JSON_EXTRACT` 的基本语法 其基本语法如下所示: ```sql JSON_EXTRACT(json_doc, path [, path] ...) ``` - **json_doc**: 表示要解析JSON 文本。 - **path**: 定义了需要提取的具体位置。 如果目标是一个数组项,则可以使用索引来访问具体的元素[^3]。例如: ```sql SELECT JSON_EXTRACT('[10, 20, 30]', '$[1]'); -- 输出: 20 ``` 除了 `JSON_EXTRACT` 外,还有其他一些常用的 JSON 函数可以帮助更灵活地操作 JSON 数据。比如 `JSON_CONTAINS` 可以用来判断某个值是否存在於 JSON 对象或数组之中[^1]。 对于实际应用案例来说,在业务场景下当数据库某列存储的是较大的 JSON 格式的字符串时,直接利用这些内置函数按需取数而非全量加载再做进一步处理能显著提升性能并简化逻辑流程[^2]。 另外值得注意的一点是关于返回类型的转换问题。有时候我们可能希望得到整数值而不是默认情况下被包裹起来作为字符串形式的结果。这时可以通过箭头运算符 (`->>`) 实现自动类型转换[^3]: ```sql SELECT myjson ->> '$.Data.List[0].ID' AS intid FROM ... ``` 综上所述,无论是简单的键值对还是复杂的嵌套结构甚至是列表型数据,借助于MySQL所提供的这一系列针对JSON格式的支持工具都能很好地满足日常开发需求当中涉及到的各种情况下的读写要求。 ```sql -- 示例代码展示如何结合WHERE条件过滤记录以及同时获取多个字段的信息 SELECT id, name, JSON_UNQUOTE(JSON_EXTRACT(details, '$.address')) AS address, CAST(JSON_EXTRACT(details, '$.age') AS UNSIGNED) AS age_in_years FROM users WHERE JSON_EXTRACT(details, '$.status') = '"active"'; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gcygeeker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值