MySQL5.7解析json数组

虽然我不太想把字段设计成json形式来保存数据,但是有时候遇到一些业务场景,这种json格式来存数据的方式确实有其可取之处。在java代码里处理过无数json,但是在数据库中直接处理还是头一次,所以记录一下。

1、模拟业务场景

我遇到的业务场景大致如下:
一个条数据,一个key,key我是直接用自增id来表示,但是具体内容需要国际化展示,就是说一个key除了对应中文的内容,还有英文、繁体、越南语、马来语等等一堆的国际化,所以我将这种国际化的name以国际化键值对象的json数组表示,大致内容如下:

[{"locale":"zh_CN","name":"清华大学"},{"locale":"zh_TW","name":"清華大學"},{"locale":"en_US","name":"Tsinghua University"},{"locale":"th_TH","name":"Qinghua มหาวิทยาลัย"},{"locale":"vi_VN","name":"Tiểu Sinh"}]

而我在一个业务场景中需要将简体中文的内容拿出来用,也就是上面的"清华大学"几个字,下面开始解析。

2、数据库

MySQL,版本5.7及以上会自带JSON_EXTRACT函数去来解析json,5.7之前的,就直接截取字符串了,这个没什么好说的,想怎么截就怎么截。

3、创建表及添加数据数据

-- 建表
CREATE TABLE `t_school` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `i18n_name` varchar(500) DEFAULT NULL COMMENT '国际化名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- 添加数据
INSERT INTO `lgs_tool_db`.`t_school`(`id`, `i18n_name`) VALUES (1, '[{\"locale\":\"zh_CN\",\"name\":\"清华大学\"},{\"locale\":\"zh_TW\",\"name\":\"清華大學\"},{\"locale\":\"en_US\",\"name\":\"Tsinghua University\"},{\"locale\":\"th_TH\",\"name\":\"Qinghua มหาวิทยาลัย\"},{\"locale\":\"vi_VN\",\"name\":\"Tiểu Sinh\"}]');
INSERT INTO `lgs_tool_db`.`t_school`(`id`, `i18n_name`) VALUES (2, '[{\"locale\":\"zh_CN\",\"name\":\"北京大学\"},{\"locale\":\"zh_TW\",\"name\":\"北京大學\"},{\"locale\":\"en_US\",\"name\":\"Peking University\"},{\"locale\":\"th_TH\",\"name\":\"มหาวิทยาลัยปักกิ่ง\"},{\"locale\":\"vi_VN\",\"name\":\"Đại học Bắc Kinh\"}]');

加好字后,数据如下显示:
国际化数据

4、解析jsonArray

MySQL5.7之后,自带JSON_EXTRACT函数解析json:
JSON_EXTRACT(json_doc, path[, path] …)
参数如下:
json_doc:待解析的json字符串,可以是自己写的字符串,也可以是表中json格式字段的字段名(注意:该字段不一定非要是json类型的,也可以是varchar,text这类的)。
path[…:需要获取的json字段名,想解析多个json对象字段就写多个。

  1. 获取所有的简体中文的名称
SELECT JSON_EXTRACT(i18n_name,'$[0].name') FROM t_school

注意:$[0].name是一种格式,0是代表我想取jsonArray数组的第一个对象,name是json对象的字段名。
结果如下:
所有简体中文内容
2. 获取所有语言的名称

SELECT JSON_EXTRACT(i18n_name,'$[*].name') FROM t_school

只是把上一句的0改成了*,就代表取jsonArray里的所有对象的name值
结果如下:
有语言的名称
3. 取所有语言和其对应的名称

SELECT JSON_EXTRACT(i18n_name,'$[*].locale','$[*].name') FROM t_school

函数后面的字段参数写了两个,表示想查json对象两个字段的值,结果如下:
所有语言和其对应的名称
4. 去掉引号
上面数据查出来了,但是引号却是多余的,所以已第一个例子为例,去除引号:

SELECT REPLACE(JSON_EXTRACT(i18n_name,'$[0].name'),'\"','') AS locale  FROM t_school

以上只是把结果中的引号给替换掉了,结果如下:
去掉引号的结果
5. jsonObject解析
上面几个是jsonArray的解析,如果保存的是json对象而不是json数组,那就需要用解析json对象的方式,json对象的解析也是用这个函数,就是json字段名那里不需要中括号,大致如下:

SELECT REPLACE(JSON_EXTRACT(i18n_name,'$.name'),'\"','') AS locale  FROM t_school

这个我没去验证了,但是肯定可以的。

以上就是JSON_EXTRACT对json解析。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MySQL 5.7 版本及以后,提供了对 JSON 数据类型的支持。MySQL 内置了一些处理 JSON 数据的函数,可以方便地查询和操作 JSON 数据。 要解析 JSON 数组,可以使用 `JSON_EXTRACT()` 函数和 MySQL 提供的 JSON 路径表达式,具体操作步骤如下: 1. 创建一个表,包含一个 JSON 类型的字段: ```sql CREATE TABLE test_json ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `data` JSON NOT NULL ); ``` 2. 插入一些数据,包含一个 JSON 数组: ```sql INSERT INTO test_json (`data`) VALUES ('["apple", "banana", "cherry"]'), ('["orange", "pear", "pineapple"]'); ``` 3. 使用 `JSON_EXTRACT()` 函数解析 JSON 数组,返回指定位置的元素: ```sql SELECT JSON_EXTRACT(`data`, '$[0]') AS `first_element` FROM test_json; ``` 输出结果为: ``` +---------------+ | first_element | +---------------+ | "apple" | | "orange" | +---------------+ ``` 上述 SQL 语句中,`JSON_EXTRACT()` 函数的第一个参数是 JSON 类型的字段,第二个参数是 JSON 路径表达式,`$[0]` 表示取 JSON 数组中的第一个元素。 4. 可以使用 `JSON_LENGTH()` 函数获取 JSON 数组的长度,然后使用 `JSON_EXTRACT()` 函数遍历数组: ```sql SELECT JSON_EXTRACT(`data`, CONCAT('$[', n, ']')) AS `element` FROM test_json JOIN (SELECT 0 AS n UNION SELECT 1 UNION SELECT 2) AS numbers ON n < JSON_LENGTH(`data`); ``` 输出结果为: ``` +-----------+ | element | +-----------+ | "apple" | | "banana" | | "cherry" | | "orange" | | "pear" | | "pineapple"| +-----------+ ``` 上述 SQL 语句中,使用了一个子查询生成一个数字序列,然后使用 `JSON_LENGTH()` 函数获取数组长度,使用 `CONCAT()` 函数和数字序列生成 JSON 路径表达式,最后使用 `JSON_EXTRACT()` 函数遍历数组。 以上就是在 MySQL解析 JSON 数组的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值