【问题标题】:MariaDB parse a JSON StringMariaDB 解析 JSON 字符串
【发布时间】:2021-04-25 05:32:01
【问题描述】:

这适用于 SQL Server:

    declare @jstring varchar(max)='{
    "FieldInfo": {
        "Template": "Babies",
        "Groups": [{
            "Group": "Required",
            "SortOrder": 1,
            "BackgroundColor": "FCD5B4",
            "Fields": [{
                "fieldName": "feed_product_type",
                "SortOrder": 1,
                "labelName": "Product Type",
                "defaultValue": "",
                "columnIndex": 0
            }, {
                "fieldName": "item_sku",
                "SortOrder": 2,
                "labelName": "Seller SKU",
                "defaultValue": "",
                "columnIndex": 1
            }, {
                "fieldName": "brand_name",
                "SortOrder": 3,
                "labelName": "Brand",
                "defaultValue": "",
                "columnIndex": 2
            }, {
                "fieldName": "item_name",
                "SortOrder": 4,
                "labelName": "Title",
                "defaultValue": "",
                "columnIndex": 3
            }, {
                "fieldName": "external_product_id",
                "SortOrder": 5,
                "labelName": "Product ID",
                "defaultValue": "",
                "columnIndex": 4
            }, {
                "fieldName": "external_product_id_type",
                "SortOrder": 6,
                "labelName": "Product ID Type",
                "defaultValue": "",
                "columnIndex": 5
            }, {
                "fieldName": "item_type",
                "SortOrder": 7,
                "labelName": "Item Type Keyword",
                "defaultValue": "",
                "columnIndex": 6
            }, {
                "fieldName": "model",
                "SortOrder": 8,
                "labelName": "Model Number",
                "defaultValue": "",
                "columnIndex": 7
            }, {
                "fieldName": "manufacturer",
                "SortOrder": 9,
                "labelName": "Manufacturer",
                "defaultValue": "",
                "columnIndex": 8
            }, {
                "fieldName": "part_number",
                "SortOrder": 10,
                "labelName": "Part Number",
                "defaultValue": "",
                "columnIndex": 9
            }, {
                "fieldName": "mfg_minimum",
                "SortOrder": 11,
                "labelName": "Minimum Manufacturer Age  Recommended",
                "defaultValue": "",
                "columnIndex": 10
            }, {
                "fieldName": "standard_price",
                "SortOrder": 12,
                "labelName": "Standard Price",
                "defaultValue": "",
                "columnIndex": 11
            }, {
                "fieldName": "quantity",
                "SortOrder": 13,
                "labelName": "Quantity",
                "defaultValue": "",
                "columnIndex": 12
            }, {
                "fieldName": "main_image_url",
                "SortOrder": 14,
                "labelName": "Main Image URL",
                "defaultValue": "",
                "columnIndex": 13
            }]
        }, {
            "Group": "Images",
            "SortOrder": 2,
            "BackgroundColor": "FFFF00",
            "Fields": [{
                "fieldName": "other_image_url1",
                "SortOrder": 15,
                "labelName": "Other Image URL1",
                "defaultValue": "",
                "columnIndex": 14
            }, {
                "fieldName": "other_image_url2",
                "SortOrder": 16,
                "labelName": "Other Image URL2",
                "defaultValue": "",
                "columnIndex": 15
            }, {
                "fieldName": "other_image_url3",
                "SortOrder": 17,
                "labelName": "Other Image URL3",
                "defaultValue": "",
                "columnIndex": 16
            }, {
                "fieldName": "other_image_url4",
                "SortOrder": 18,
                "labelName": "Other Image URL4",
                "defaultValue": "",
                "columnIndex": 17
            }, {
                "fieldName": "other_image_url5",
                "SortOrder": 19,
                "labelName": "Other Image URL5",
                "defaultValue": "",
                "columnIndex": 18
            }, {
                "fieldName": "other_image_url6",
                "SortOrder": 20,
                "labelName": "Other Image URL6",
                "defaultValue": "",
                "columnIndex": 19
            }, {
                "fieldName": "other_image_url7",
                "SortOrder": 21,
                "labelName": "Other Image URL7",
                "defaultValue": "",
                "columnIndex": 20
            }, {
                "fieldName": "other_image_url8",
                "SortOrder": 22,
                "labelName": "Other Image URL8",
                "defaultValue": "",
                "columnIndex": 21
            }, {
                "fieldName": "swatch_image_url",
                "SortOrder": 23,
                "labelName": "Swatch Image URL",
                "defaultValue": "",
                "columnIndex": 22
            }]
        }, {
            "Group": "Variation",
            "SortOrder": 3,
            "BackgroundColor": "FF8080",
            "Fields": [{
                "fieldName": "parent_child",
                "SortOrder": 24,
                "labelName": "Parentage",
                "defaultValue": "",
                "columnIndex": 23
            }, {
                "fieldName": "relationship_type",
                "SortOrder": 25,
                "labelName": "Relationship Type",
                "defaultValue": "",
                "columnIndex": 24
            }, {
                "fieldName": "parent_sku",
                "SortOrder": 26,
                "labelName": "Parent SKU",
                "defaultValue": "",
                "columnIndex": 25
            }, {
                "fieldName": "variation_theme",
                "SortOrder": 27,
                "labelName": "Variation Theme",
                "defaultValue": "",
                "columnIndex": 26
            }]
        }, {
            "Group": "Basic",
            "SortOrder": 4,
            "BackgroundColor": "F8A45E",
            "Fields": [{
                "fieldName": "update_delete",
                "SortOrder": 28,
                "labelName": "Update Delete",
                "defaultValue": "",
                "columnIndex": 27
            }, {
                "fieldName": "product_description",
                "SortOrder": 29,
                "labelName": "Description",
                "defaultValue": "",
                "columnIndex": 28
            }, {
                "fieldName": "care_instructions",
                "SortOrder": 30,
                "labelName": "Care Instructions",
                "defaultValue": "",
                "columnIndex": 29
            }, {
                "fieldName": "target_gender",
                "SortOrder": 31,
                "labelName": "Target Gender",
                "defaultValue": "",
                "columnIndex": 30
            }, {
                "fieldName": "edition",
                "SortOrder": 32,
                "labelName": "Edition",
                "defaultValue": "",
                "columnIndex": 31
            }]
        }]
    }
}'
--drop table #AmazonTemplateInfo
;with FieldInfo as (
select Template,[Group],GroupSort,BackgroundColor,FieldName,FieldSort,LabelName,DefaultValue,ColumnIndex from OPENJSON(@jstring,'$.FieldInfo')
        With (
            Template varchar(50)
            ,Groups nvarchar(max) as json
        ) as Template
    cross apply openjson (Template.Groups)
        with (
            [Group] varchar(50)
            ,BackgroundColor varchar(6)
            ,GroupSort int '$.SortOrder'
            ,Fields nvarchar(max) as json
        ) Groups
    cross apply openjson(Groups.Fields)
        with (
            fieldName varchar(50)
            ,FieldSort int '$.SortOrder'
            ,labelName varchar(50)
            ,defaultValue varchar(max)
            ,columnIndex int
        ) Fields
)
select * from FieldInfo

这会在表单中生成一个表格

Template Group GroupSort BackgroundColor FieldName FieldSort LabelName DefaultValue ColumnIndex
Babies Required 1 FCD5B4 feed_product_type 1 Product Type 0

我需要在 MariaDB v10 中创建相同的功能。我已经尝试使用JSON_EXTRACT 并且适用于我的十字架的 LATERAL 语句,但没有任何效果。 JSON_EXTRACT 似乎只是从选定的列中创建一个 JSON 字符串。

这在 MariaDB 中毫无意义吗?有没有办法做到这一点?

【问题讨论】:

  • MySQL 没有版本 10,所以我假设您必须使用 MariaDB。我已经编辑了您的问题和标签,以表明您正在使用 MariaDB。
  • 是的……没错。我刚接到这个项目,我什至没有注意到。

标签: parsing mariadb mysql-json


【解决方案1】:

嗯……终于。如果有人感兴趣,这就是我在 MariaDB 中解析多级 JSON 字符串的方式:

set @jstring='{"FieldInfo": {"Template": "Babies","Groups": [{"Group": "Required","SortOrder": 1,"BackgroundColor": "FCD5B4","Fields": [{"fieldName": "feed_product_type","SortOrder": 1,"labelName": "Product Type","defaultValue": "","columnIndex": 0}, {"fieldName": "item_sku","SortOrder": 2,"labelName": "Seller SKU","defaultValue": "","columnIndex": 1}, {"fieldName": "brand_name","SortOrder": 3,"labelName": "Brand","defaultValue": "","columnIndex": 2}, {"fieldName": "item_name","SortOrder": 4,"labelName": "Title","defaultValue": "","columnIndex": 3}, {"fieldName": "external_product_id","SortOrder": 5,"labelName": "Product ID","defaultValue": "","columnIndex": 4}, {"fieldName": "external_product_id_type","SortOrder": 6,"labelName": "Product ID Type","defaultValue": "","columnIndex": 5}, {"fieldName": "item_type","SortOrder": 7,"labelName": "Item Type Keyword","defaultValue": "","columnIndex": 6}, {"fieldName": "model","SortOrder": 8,"labelName": "Model Number","defaultValue": "","columnIndex": 7}, {"fieldName": "manufacturer","SortOrder": 9,"labelName": "Manufacturer","defaultValue": "","columnIndex": 8}, {"fieldName": "part_number","SortOrder": 10,"labelName": "Part Number","defaultValue": "","columnIndex": 9}, {"fieldName": "mfg_minimum","SortOrder": 11,"labelName": "Minimum Manufacturer Age  Recommended","defaultValue": "","columnIndex": 10}, {"fieldName": "standard_price","SortOrder": 12,"labelName": "Standard Price","defaultValue": "","columnIndex": 11}, {"fieldName": "quantity","SortOrder": 13,"labelName": "Quantity","defaultValue": "","columnIndex": 12}, {"fieldName": "main_image_url","SortOrder": 14,"labelName": "Main Image URL","defaultValue": "","columnIndex": 13}]}, {"Group": "Images","SortOrder": 2,"BackgroundColor": "FFFF00","Fields": [{"fieldName": "other_image_url1","SortOrder": 15,"labelName": "Other Image URL1","defaultValue": "","columnIndex": 14}, {"fieldName": "other_image_url2","SortOrder": 16,"labelName": "Other Image URL2","defaultValue": "","columnIndex": 15}, {"fieldName": "other_image_url3","SortOrder": 17,"labelName": "Other Image URL3","defaultValue": "","columnIndex": 16}, {"fieldName": "other_image_url4","SortOrder": 18,"labelName": "Other Image URL4","defaultValue": "","columnIndex": 17}, {"fieldName": "other_image_url5","SortOrder": 19,"labelName": "Other Image URL5","defaultValue": "","columnIndex": 18}, {"fieldName": "other_image_url6","SortOrder": 20,"labelName": "Other Image URL6","defaultValue": "","columnIndex": 19}, {"fieldName": "other_image_url7","SortOrder": 21,"labelName": "Other Image URL7","defaultValue": "","columnIndex": 20}, {"fieldName": "other_image_url8","SortOrder": 22,"labelName": "Other Image URL8","defaultValue": "","columnIndex": 21}, {"fieldName": "swatch_image_url","SortOrder": 23,"labelName": "Swatch Image URL","defaultValue": "","columnIndex": 22}]}, {"Group": "Variation","SortOrder": 3,"BackgroundColor": "FF8080","Fields": [{"fieldName": "parent_child","SortOrder": 24,"labelName": "Parentage","defaultValue": "","columnIndex": 23}, {"fieldName": "relationship_type","SortOrder": 25,"labelName": "Relationship Type","defaultValue": "","columnIndex": 24}, {"fieldName": "parent_sku","SortOrder": 26,"labelName": "Parent SKU","defaultValue": "","columnIndex": 25}, {"fieldName": "variation_theme","SortOrder": 27,"labelName": "Variation Theme","defaultValue": "","columnIndex": 26}]}, {"Group": "Basic","SortOrder": 4,"BackgroundColor": "F8A45E","Fields": [{"fieldName": "update_delete","SortOrder": 28,"labelName": "Update Delete","defaultValue": "","columnIndex": 27}, {"fieldName": "product_description","SortOrder": 29,"labelName": "Description","defaultValue": "","columnIndex": 28}, {"fieldName": "care_instructions","SortOrder": 30,"labelName": "Care Instructions","defaultValue": "","columnIndex": 29}, {"fieldName": "target_gender","SortOrder": 31,"labelName": "Target Gender","defaultValue": "","columnIndex": 30}, {"fieldName": "edition","SortOrder": 32,"labelName": "Edition","defaultValue": "","columnIndex": 31}]}]}}'

;with t1 as (
    select JSON_Value(@jstring,'$.FieldInfo.Template') as Template, JSON_Query(@jstring,'$.FieldInfo.Groups') as jStringGroups
)
SELECT Template,jstringGroups into @Template, @jStringGroups from t1;
set @numGroups=JSON_Length(@jStringGroups,'$');
SET max_recursive_iterations=100000; 


;with recursive  t2  as (
    select 0 curLev
        , @Template Template
        , @jStringGroups jStringGroups
        , JSON_Value(@jStringGroups,'$[0].Group') 'Group'
        ,cast(JSON_Value(@jStringGroups,'$[0].SortOrder') as int) GroupSort
        ,JSON_Value(@jStringGroups,'$[0].BackgroundColor') BackgroundColor
        ,JSON_Query(@jStringGroups,'$[0].Fields') fieldString 
        ,CAST(JSON_Length(JSON_Query(@jStringGroups,'$[0].Fields'),'$') as int) numFields
       UNION
    select t2.curLev+1
        , t2.Template
        , t2.jStringGroups
        , JSON_Value(t2.jStringGroups,CONCAT('$[',t2.curLev+1,'].Group'))
        , JSON_Value(t2.jStringGroups,CONCAT('$[',t2.curLev+1,'].SortOrder')) 
        , JSON_Value(t2.jStringGroups,CONCAT('$[',t2.curLev+1,'].BackgroundColor'))
        , JSON_Query(t2.jStringGroups,CONCAT('$[',t2.curLev+1,'].Fields'))  
        , JSON_Length(JSON_Query(t2.jStringGroups,CONCAT('$[',t2.curLev+1,'].Fields')),'$')
    from t2 where t2.curLev+1<@numGroups
),
t3 as (
        select 0 curLev
            ,Template
            ,t2.Group
            ,GroupSort
            ,BackgroundColor
            ,fieldString
            ,numfields
            ,JSON_Value(t2.fieldString,'$[0].fieldName') fieldName
            ,cast(JSON_Value(t2.fieldString,'$[0].SortOrder') as int) fieldSort
            ,JSON_Value(t2.fieldString,'$[0].labelName') labelName
            ,JSON_Value(t2.fieldString,'$[0].defaultValue') defaultValue
            ,cast(JSON_Value(t2.fieldString,'$[0].columnIndex') as int) columnIndex
        from t2
        UNION
        select t3.curLev+1
            ,t3.Template
            ,t3.Group
            ,t3.GroupSort
            ,t3.BackgroundColor
            ,t3.fieldString
            ,t3.numfields
            ,JSON_Value(t3.fieldString,CONCAT('$[',t3.curLev+1,'].fieldName'))
            ,JSON_Value(t3.fieldString,CONCAT('$[',t3.curLev+1,'].SortOrder'))
            ,JSON_Value(t3.fieldString,CONCAT('$[',t3.curLev+1,'].labelName'))
            ,JSON_Value(t3.fieldString,CONCAT('$[',t3.curLev+1,'].defaultValue'))
            ,JSON_Value(t3.fieldString,CONCAT('$[',t3.curLev+1,'].columnIndex'))
        from t3
        where t3.curLev+1<t3.numFields
    )

select Template,t3.Group,GroupSort,FieldName,FieldSort,LabelName,DefaultValue,ColumnIndex from t3 order by GroupSort, fieldSort;

这让我得到了我的桌子。

【讨论】:

    【解决方案2】:

    MySQL 有一个与您所描述的功能相近的功能,它是 JSON_TABLE() 函数。查看文档和示例:

    但是,您说您使用的是“v10”,它是 MariaDB 版本号,而不是 MySQL 版本号。 MariaDB 和 MySQL 是不同的软件产品。它们在 2010 年有一个共同的源代码来源,但从那以后它们一直在慢慢分化。这样一来,就有点像 Microsoft SQL Server 和 Sybase 的比较了。

    没有任何版本的 MariaDB 至少达到 10.5 实现 JSON_TABLE() 函数。也许未来的某个版本会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 2014-07-22
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多