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中主键为0与主键自排约束的关系详解(细节)

    MySQL中主键为0与主键自排约束的关系详解(细节)

    这篇文章主要给大家介绍了关于MySQL中主键为0与主键自排约束的关系的相关资料,主要介绍的是其中的一些非常细的细节,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • MySQL中distinct语句去查询重复记录及相关的性能讨论

    MySQL中distinct语句去查询重复记录及相关的性能讨论

    这篇文章主要介绍了MySQL中distinct语句去查询重复记录及相关的性能讨论,文中的观点是在一定情况下避免在最高层查询中使用distinct,需要的朋友可以参考下
    2016-01-01
  • MySQL登录时出现ERROR 1045: Access denied for user ‘root‘@‘localhost‘ (using password: YES)无法打开解决方法汇总

    MySQL登录时出现ERROR 1045: Access denied for&

    本文已解决MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES)无法打开的相关报错问题,并总结提出了几种可用解决方案,又遇到同样问题的朋友可以参考阅读下本文
    2024-09-09
  • SQL实现LeetCode(178.分数排行)

    SQL实现LeetCode(178.分数排行)

    这篇文章主要介绍了SQL实现LeetCode(178.分数排行),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mac系统下mysql 8.0.11 安装指南

    mac系统下mysql 8.0.11 安装指南

    这篇文章主要为大家详细介绍了mac系统下mysql 8.0.11 安装指南,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • MySQL中对于NULL值的理解和使用教程

    MySQL中对于NULL值的理解和使用教程

    这篇文章主要介绍了MySQL中对于NULL值的理解和使用教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • CentOS7.4 源码安装MySQL8.0的教程详解

    CentOS7.4 源码安装MySQL8.0的教程详解

    这篇文章主要介绍了CentOS7.4 源码安装MySQL8.0的教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • mysql8.0.19忘记密码处理方法详解

    mysql8.0.19忘记密码处理方法详解

    这篇文章主要介绍了mysql8.0.19忘记密码处理方法详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • Mysql中的多级复制方式

    Mysql中的多级复制方式

    这篇文章主要介绍了Mysql中的多级复制方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • MySQL AUTO_INCREMENT 主键自增长的实现

    MySQL AUTO_INCREMENT 主键自增长的实现

    本文主要介绍了MySQL AUTO_INCREMENT 主键自增长的实现,每增加一条记录,主键会自动以相同的步长进行增长,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论