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

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

王林
王林转载
2023-05-29 20:01:461705浏览

    引言

    在开发过程中,遇到过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删除