mysql解析json数据组获取数据组所有字段的方法实例

 更新时间:2022年08月22日 11:38:42   作者:xixiangdai  
mysql在5.7开始支持json解析了,也可以解析数组,下面这篇文章主要给大家介绍了关于mysql解析json数据组获取数据组所有字段的相关资料,文中通过图文以及实例代码介绍的非常详细,需要的朋友可以参考下

引言

在开发过程中,遇到过json数据组的字符串,需要解析json组,得到组内所有的信息。如下格式:

[{"itemId":3101,"itemName":"空滤器及进气管道"},{"itemId":3102,"itemName":"水管、水泵"},{"itemId":3103,"itemName":"柴油管道"},{"itemId":3104,"itemName":"高压泵、机油泵"}]

观察json组发现,它是一个list里面包含多个json字符串,我们要做的是拆分出list所有json字符串,并对每个json字符串做解析。

做分析发现,如果是单独一个json字符串,通过 JSON_EXTRACT 方法即可。但是list里面有多个json字符串,所以我们需要对list进行拆分,变成多个json字符串。

在学习本文内容之前,需要提前了解mysql两个函数:

SUBSTRING_INDEX

JSON_EXTRACT

 具体用法,请自行百度,本文不做讲解。

第一步:一行拆分成多行

一行拆成多行,即把list拆分成多行 json,为此我们需要

1.1 新建一张表keyid,只insert从0开始的数字,如下:

在其他的教程中,通过 mysql.help_topic 表的 help_topic_id 字段也是可以的。但是这个库表需要root权限才可以使用。因此建立自己的匹配表,是最合适的。

注意:id的值,不能小于 list里面json字符串的个数。比如上述list里面的json字符串是4个,那id必须大于4。help_topic_id最大值是700,如果list里面json字符串的个数大于这个值,用help_topic_id是不合适的。

1.2 找到拆分标识符

所谓拆分标识符,就是能根据此符号,一次性拆分成多行的标志。在下面list当中,没有找到拆分标识符,因此需要处理一下。可以将 ; 当成拆分标识符。处理后的内容如下:

{"itemId":3101,"itemName":"空滤器及进气管道"};{"itemId":3102,"itemName":"水管、水泵"};{"itemId":3103,"itemName":"柴油管道"};{"itemId":3104,"itemName":"高压泵、机油泵"}

 去除前后 [ 和 ] 两个list标志,将 },{ 变成 };{ 这样就可以将 ; 变成拆分标识符。如下

select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest

1.3 通过join on拆分多行

这时候,就可以通过 将maptest表和 新建的 keyid表进行join,用on条件,匹配成多行。在通过 SUBSTRING_INDEX进行拆分。

 代码如下:

select 
a.jsonarr,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,
b.id
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join keyid b 
on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
;

到此,就完成了 将json组,拆分成多行的工作。

第二步:解析json字符串

拆分成多行之后,就可以通过 JSON_EXTRACT 进行解析了。效果如下:

完成代码如下:

select 
a.jsonarr,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ) AS jsonarr_info,
b.id,
JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,
replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemName
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join keyid b 
on b.id< ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
;

当然通过 mysql.help_topic 表的 help_topic_id 字段也是可以。代码和结果如下:

select 
a.jsonarr,
SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ) AS jsonarr_info,
b.help_topic_id,
JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemId') as itemId,
replace(JSON_EXTRACT(SUBSTRING_INDEX( SUBSTRING_INDEX( a.jsonarr, ";", b.help_topic_id + 1 ), ";",- 1 ), '$[0].itemName'),'"','') as itemName
from 
(select replace(replace(replace(jsonarr,"},{","};{"),"]",""),"[","") as jsonarr from maptest) a
join mysql.help_topic b 
on b.help_topic_id < ( length( a.jsonarr ) - length( replace ( a.jsonarr, ";", "" ) ) + 1 )
;

 注意: 通过 JSON_EXTRACT 解析出来的字段,如果是字符串,会带有 "" 双引号,只要replace替换掉即可。

总结 

到此这篇关于mysql解析json数据组获取数据组所有字段的文章就介绍到这了,更多相关mysql解析json数据组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL json相关函数及功能详解

    MySQL json相关函数及功能详解

    MySQL提供了一系列的JSON函数,用于解析、提取、修改和操作JSON数据,以下是一些常用的JSON函数及其功能,需要的朋友可以参考下
    2023-11-11
  • VMWare linux mysql 5.7.13安装配置教程

    VMWare linux mysql 5.7.13安装配置教程

    这篇文章主要为大家详细介绍了VMWare linux mysql 5.7.13安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • MySQL之MyISAM存储引擎的非聚簇索引详解

    MySQL之MyISAM存储引擎的非聚簇索引详解

    这篇文章主要为大家详细介绍了MySQL之MyISAM存储引擎的非聚簇索引,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • mysql 月份查询该月有付款的数据

    mysql 月份查询该月有付款的数据

    mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)
    2010-04-04
  • mysql5.7.17安装使用图文教程

    mysql5.7.17安装使用图文教程

    这篇文章主要为大家详细介绍了MySql安装与使用图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • MySQL查看日志简单易懂保姆级教程

    MySQL查看日志简单易懂保姆级教程

    这篇文章主要给大家介绍了关于MySQL查看日志简单易懂保姆级教程的相关资料,在操作MySQL数据库的时候会留下每一个步骤的痕迹,那怎么查看呢?就可以用日志去查看,需要的朋友可以参考下
    2023-08-08
  • 基于C++实现Mysql数据库连接池实例

    基于C++实现Mysql数据库连接池实例

    数据库连接池负责分配、管理、和释放数据库连接,允许使用应用程序重复使用一个现有的数据库连接。数据库连接是关键有限且昂贵的资源,一个数据库连接对象均对应一个物理数据库的连接,每次操作都打开一个物理连接,使用完都关闭连接
    2022-12-12
  • 如何利用MySQL查询varbinary中存储的数据

    如何利用MySQL查询varbinary中存储的数据

    varbinary 类型和char与varchar类型是相似的,他们是包含字节流而不是字符流,他们有二进制字符的集合和顺序,他们的对比,排序是基于字节的数值进行的,本文给大家介绍如何利用MySQL查询varbinary中存储的数据,感兴趣的朋友一起看看吧
    2023-07-07
  • MYSQL中Truncate的用法详解

    MYSQL中Truncate的用法详解

    这篇文章主要介绍了MYSQL中Truncate的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • MySql分页时使用limit+order by会出现数据重复问题解决

    MySql分页时使用limit+order by会出现数据重复问题解决

    在MySQL中我们通常会采用limit来进行翻页查询,当limit遇到 order by的时候会出现数据重复问题,本文就来记录一下,感兴趣的可以了解一下
    2021-08-08

最新评论