mysql中json_extract的使用方法

这篇具有很好参考价值的文章主要介绍了mysql中json_extract的使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、前言

mysql5.7版本开始支持JSON类型字段,本文详细介绍json_extract函数如何获取mysql中的JSON类型数据
json_extract可以完全简写为 ->
json_unquote(json_extract())可以完全简写为 ->>
下面介绍中大部分会利用简写

二、创建示例表

CREATE TABLE `test_json` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;
# 插入两条测试用的记录
INSERT INTO `test_json` (`content`) VALUES ('{\"name\":\"tom\",\"age\":18,\"score\":[100,90,87],\"address\":{\"province\":\"湖南\",\"city\":\"长沙\"}}');
INSERT INTO `test_json` (`content`) VALUES ('[1, "apple", "red", {"age": 18, "name": "tom"}]');
id content
1 {“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
2 [1, “apple”, “red”, {“age”: 18, “name”: “tom”}]

三、基本语法

- 获取JSON对象中某个key对应的value值

  • json_extract函数中,第一个参数content表示json数据,第二个参数为json路径,其中$表示该json数据本身,$.name就表示获取json中key为name的value值
  • 可以利用 -> 表达式来代替json_extract
  • 若获取的val本身为字符串,那么获取的val会被引号包起来,比如"tom",这种数据被解析到程序对象中时,可能会被转义为\“tom\”。为了解决这个问题了,可以在外面再包上一层json_unquote函数,或者使用 ->> 代替->

content:
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}

# 得到"tom"
select json_extract(content,'$.name') from test_json where id = 1;
# 简写方式:字段名->表达式等价于json_extract(字段名,表达式)
select content->'$.name' from test_json where id = 1;
# 结果:
+--------------------------------+
| json_extract(content,'$.name') |
+--------------------------------+
| "tom"                          |
+--------------------------------+
+-------------------+
| content->'$.name' |
+-------------------+
| "tom"             |
+-------------------+

# 解除双引号,得到tom
select json_unquote(json_extract(content,'$.name')) from test_json where id = 1;
# 简写方式:字段名->>表达式等价于json_unquote(json_extract(字段名,表达式))
select content->>'$.name' from test_json where id = 1;
# 结果:
+----------------------------------------------+
| json_unquote(json_extract(content,'$.name')) |
+----------------------------------------------+
| tom                                          |
+----------------------------------------------+
+--------------------+
| content->>'$.name' |
+--------------------+
| tom                |
+--------------------+

- 获取JSON数组中某个元素

  • json_extract函数中,第一个参数content表示json数据,第二个参数为json路径,其中$表示该json数据本身,$[i]表示获取该json数组索引为i的元素(索引从0开始)
  • 与获取key-val一样,若获取的元素为字符串,默认的方式也会得到双引号包起来的字符,导致程序转义,方法也是利用json_unquote函数,或者使用 ->> 代替->

content:
[1, “apple”, “red”, {“age”: 18, “name”: “tom”}]

# 得到"apple"
select json_extract(content,'$[1]') from test_json where id = 2;
# 简写,效果同上
select content->'$[1]' from test_json where id = 2;
# 结果:
+------------------------------+
| json_extract(content,'$[1]') |
+------------------------------+
| "apple"                      |
+------------------------------+
+-----------------+
| content->'$[1]' |
+-----------------+
| "apple"         |
+-----------------+

# 解除双引号,得到apple 
select json_unquote(json_extract(content,'$[1]')) from test_json where id = 2;
# 简写,效果同上
select content->>'$[1]' from test_json where id = 2;
# 结果:
+--------------------------------------------+
| json_unquote(json_extract(content,'$[1]')) |
+--------------------------------------------+
| apple                                      |
+--------------------------------------------+
+------------------+
| content->>'$[1]' |
+------------------+
| apple            |
+------------------+

- 获取JSON中的嵌套数据

  • 结合前面介绍的两种获取方式,可以获取json数据中的嵌套数据

content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}
content: id=2
[1, “apple”, “red”, {“age”: 18, “name”: “tom”}]

# 得到:87
select content->'$.score[2]' from test_json where id = 1;
# 结果:
+-----------------------+
| content->'$.score[2]' |
+-----------------------+
| 87                    |
+-----------------------+

# 得到:18
select content->'$[3].age' from test_json where id = 2;
# 结果:
+---------------------+
| content->'$[3].age' |
+---------------------+
| 18                  |
+---------------------+

四、渐入佳境

- 获取JSON多个路径的数据

  • 将会把多个路径的数据组合成数组返回

content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}

select json_extract(content,'$.age','$.score') from test_json where id = 1;
# 结果:
+-----------------------------------------+
| json_extract(content,'$.age','$.score') |
+-----------------------------------------+
| [18, [100, 90, 87]]                     |
+-----------------------------------------+

select json_extract(content,'$.name','$.address.province','$.address.city') from test_json where id = 1;
# 结果:
+----------------------------------------------------------------------+
| json_extract(content,'$.name','$.address.province','$.address.city') |
+----------------------------------------------------------------------+
| ["tom", "湖南", "长沙"]                                              |
+----------------------------------------------------------------------+

- 路径表达式*的使用

  • 将会把多个路径的数据组合成数组返回
# 先插入一条用于测试的数据
INSERT INTO `test_json` (`id`,`content`) VALUES(3,'{"name":"tom","address":{"name":"中央公园","city":"长沙"},"class":{"id":3,"name":"一年三班"},"friend":[{"age":20,"name":"marry"},{"age":21,"name":"Bob"}]}')

content: id=3
{“name”: “tom”, “class”: {“id”: 3, “name”: “一年三班”}, “friend”: [{“age”: 20, “name”: “marry”}, {“age”: 21, “name”: “Bob”}], “address”: {“city”: “长沙”, “name”: “中央公园”}}

# 获取所有二级嵌套中key=name的值
# 由于friend的二级嵌套是一个数组,所以.name获取不到其中的所有name值
select content->'$.*.name' from test_json where id = 3;
+----------------------------------+
| content->'$.*.name'              |
+----------------------------------+
| ["一年三班", "中央公园"]         |
+----------------------------------+```

# 获取所有key为name值的数据,包括任何嵌套内的name
select content->'$**.name' from test_json where id = 3;
+---------------------------------------------------------+
| content->'$**.name'                                     |
+---------------------------------------------------------+
| ["tom", "一年三班", "marry", "Bob", "中央公园"]         |
+---------------------------------------------------------+

# 获取数组中所有的name值
select content->'$.friend[*].name' from test_json where id = 3;
+-----------------------------+
| content->'$.friend[*].name' |
+-----------------------------+
| ["marry", "Bob"]            |
+-----------------------------+

- 返回NULL值

content: id=1
{“age”: 18, “name”: “tom”, “score”: [100, 90, 87], “address”: {“city”: “长沙”, “province”: “湖南”}}

  • 寻找的JSON路径都不存在
# age路径不存在,返回NULL
# 若有多个路径,只要有一个路径存在则不会返回NULL
select json_extract(content,'$.price') from test_json where id = 1;
+---------------------------------+
| json_extract(content,'$.price') |
+---------------------------------+
| NULL                            |
+---------------------------------+

  • 路径中有NULL
# 存在任意路径为NULL则返回NULL
select json_extract(content,'$.age',NULL) from test_json where id = 1;
+------------------------------------+
| json_extract(content,'$.age',NULL) |
+------------------------------------+
| NULL                               |
+------------------------------------+

- 返回错误

  • 若第一个参数不是JSON类型的数据,则返回错误
select json_extract('{1,2]',$[0])
  • 若路径表达式不规范,则返回错误
select content->'$age' from test_json where id = 1;
# 结果:
ERROR 3143 (42000): Invalid JSON path expression. The error is around character position 1.

五、使用场景

  • JSON_EXTRACT函数通常用于要获取JSON中某个特定的数据或者要根据它作为判断条件时使用

六、参考文档

mysql5.7官方文档
https://www.sjkjc.com/mysql-ref/json_extract
文章来源地址https://www.toymoban.com/news/detail-460425.html

到了这里,关于mysql中json_extract的使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【微信小程序】使用 JSON.parse 方法将返回的 JSON 字符串解析为对象

    在微信小程序中,你可以使用 JSON.parse 方法将返回的 JSON 字符串解析为对象。以下是实现类似功能的示例代码: 在上述代码中,我们使用 JSON.parse 方法将返回的 JSON 字符串解析为对象。然后,我们可以通过点语法或方括号语法访问解析后的对象的属性,例如 data.result 。 请注

    2024年02月15日
    浏览(49)
  • 使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

    未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式,使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 在Spring框架中,WebMvcConfigurationSupport 是一个类,它可以用于自定义Spring MVC的配置。如果您在应用程序中使用了WebMvcConfigurationSupport,而且之前返回的JSO

    2024年02月13日
    浏览(43)
  • 如何使用 Java 将 JSON 文件读取为字符串?这三种方法很管用!

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它可以用来存储和传输结构化的数据。在 Java 中,有多种方法可以将 JSON 文件读取为字符串,本文将介绍其中的几种。 java.io 包中提供了一些类,如 FileReader、BufferedReader、InputStreamReader 等,可以用来读取文件的内容。

    2024年02月01日
    浏览(87)
  • PHP解析带BOM头的JSON数据,对接他人接口的时候,使用json_decode(),返回null的问题与解决方法

    在php开发中会遇到和他人对接接口,对方使用json传输数据,使用json_decode()函数却无法将json数据转换为数组。 先看封装的代码 这种对接post接口的封装方法一般是没有问题的,但是我们打印$res的时候,会发现只会返回NULL。而打印$response的时候,是可以返回json字符串的。我们

    2024年02月06日
    浏览(46)
  • Jwt(Json web token)——使用token的权限验证方法 & 用户+角色+权限表设计 & SpringBoot项目应用

    1.认证鉴权服务,注册中心,认证中心,鉴权中心; 2.用户,角色,权限表设计,数据库视图的使用; 3.项目中的应用,使用自定义注解+拦截器; 4.枚举类型的json化, @JsonFormat(shape = JsonFormat.Shape.OBJECT) @Getter https://gitee.com/pet365/springboot-privs-token 用户和权限之间关系(多对多

    2024年02月14日
    浏览(71)
  • Navicat for MySQL 视图创建使用方法

    创建视图步骤: 点击 新建 ; 选择 视图 ; 点击 视图创建工具 ; 可以在左侧拖拽表到工作区; 选择表字段进行连线

    2024年02月08日
    浏览(37)
  • 使用MySQL的加密和解密方法详解

    在数据库应用程序中,数据的安全性是至关重要的。为了保护敏感数据免受未经授权的访问,我们可以使用加密和解密技术。MySQL提供了几种方法来实现数据加密和解密,本文将重点介绍这些方法并提供相应的源代码示例。 一、使用AES_ENCRYPT和AES_DECRYPT函数进行加密和解密 M

    2024年02月02日
    浏览(58)
  • 【MySQL】使用LOAD DATA INFILE命令加载数据文件到MySQL数据库的方法和常见错误及解决方法

    【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:SQLplusDB) 在MySQL数据库中,可以使用LOAD DATA INFILE命令将数据从 CSV 文件导入已创建的表中。 LOAD DATA INFILE的语法详细如下: 参考: 3.3.3 Loading Data into a Table https://dev.mysql.com/doc/refman/8.

    2024年02月09日
    浏览(45)
  • MySQL中 java 的 JDBC 编程使用方法及驱动包的下载和使用

    实际开发中要绝大多数要 通过代码 来执行 sql 语句,这就需要让其他的编程语言来操作数据库服务器。 API 是什么意思: 例子:某个东西可以带给我某个功能。 例子:我可以和我的朋友一起吃法、一起学习、一起打游戏。 例如 java 的标准库就会给我们提供一些 API ,这个

    2024年02月04日
    浏览(42)
  • MySQL分区表的正确使用方法,适用场景,建立分区的条件

    什么是MySQL分区? MySQL分区是将一张表分割成独立的子表的技术。每个子表被称为分区,它们有着相同的结构和字段,但存储着不同的数据。这项技术可以提高查询速度,减少日志文件和磁盘空间的使用。 建立分区的条件 要建立MySQL分区,需要满足以下几个条件: 1.所需的

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包