首页 > 数据库 > mysql教程 > mysql解析json数据组怎么获取数据组所有字段

mysql解析json数据组怎么获取数据组所有字段

王林
发布: 2023-05-29 20:01:46
转载
1797 人浏览过

    引言

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

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

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

    分析后发现,当JSON字符串独立存在时,可以使用JSON_EXTRACT方法进行提取。由于列表中包含多个JSON字符串,因此我们需要将列表拆分为多个JSON字符串。

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

    SUBSTRING_INDEX

    JSON_EXTRACT

    第一步:一行拆分成多行

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

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

    mysql解析json数据组怎么获取数据组所有字段

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

    注意:id的值,不能小于 list里面json字符串的个数。举例来说,如果在上述列表中有4个JSON字符串,那么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
    登录后复制

    mysql解析json数据组怎么获取数据组所有字段

    1.3 通过join on拆分多行

    此时,我们可以通过使用JOIN操作将maptest表和新建的keyid表连接起来,在ON条件下匹配多行数据。在通过 SUBSTRING_INDEX进行拆分。

    mysql解析json数据组怎么获取数据组所有字段

    代码如下:

    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 进行解析了。效果如下:

    mysql解析json数据组怎么获取数据组所有字段

    完成代码如下:

    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 字段也是可以。代码和结果如下:

    mysql解析json数据组怎么获取数据组所有字段

    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数据组怎么获取数据组所有字段的详细内容。更多信息请关注PHP中文网其他相关文章!

    相关标签:
    来源:yisu.com
    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板