如何从 MySQL 中提取 JSON 数组

Posted

技术标签:

【中文标题】如何从 MySQL 中提取 JSON 数组【英文标题】:How to Extract JSON Array from MySQL 【发布时间】:2017-11-28 00:14:49 【问题描述】:

我打算将一个 JSON 数组插入到我的数据库表中以用于动态目的。我在提取带有键/值对的 JSON 对象时没有任何问题,但对于 JSON 数组则相反。见下例:

["LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 555, "barcode": "EFG", "DCover": "id": 666, "barcode": "GHI", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59"]

理想情况下,根据上面的每一个,如果提取 - 它看起来像这样:

"LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59"

现在的问题是,我该如何提取它们:

1. "LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", "date_associated": "2017-11-27 23:59:59"
2. "LCM": "id": 555, "barcode": "EFG", "DCover": "id": 666, "barcode": "GHI", "date_associated": "2017-11-27 23:59:59"
3. "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59"

通过它们中的哪一个,我将能够根据需要进行解析,即:“$.LCM”或“$.DCover.barcode”

JSON_EXTRACT(...) 似乎只能通过定义特定 JSON 对象的键来使用。但这不适用于纯值 JSON 数组(据我所知)

希望,我可以在这里得到一个小费。谢谢。

【问题讨论】:

【参考方案1】:

如果你使用 mysql >= 8.0.4,你可以使用JSON_TABLE

查询示例

with tbl(val) as (
  select CAST('["LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 555, "barcode": "EFG", "DCover": "id": 666, "barcode": "GHI", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59"]'
  as json
 )
)
select rowid, content from tbl, JSON_TABLE(val, '$[*]' columns (rowid for ordinality, content json PATH '$')) as jt;

结果

+-------+---------------------------------------------------------------------------------------------------------------------------+
| rowid | content                                                                                                                   |
+-------+---------------------------------------------------------------------------------------------------------------------------+
|     1 | "LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", "date_associated": "2017-11-27 23:59:59" |
|     2 | "LCM": "id": 555, "barcode": "EFG", "DCover": "id": 666, "barcode": "GHI", "date_associated": "2017-11-27 23:59:59" |
|     3 | "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59" |
+-------+---------------------------------------------------------------------------------------------------------------------------+

【讨论】:

【参考方案2】:
 According to my understand you are using JSON Array, use iteration

 CREATE PROCEDURE `Manipulation_Json_Data`()
  LANGUAGE SQL
  NOT DETERMINISTIC
  CONTAINS SQL
  SQL SECURITY DEFINER
  COMMENT ''
  BEGIN
  DECLARE v1 INT DEFAULT 0;

  SET @j = '["LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 555, "barcode": "EFG", "DCover": "id": 666, "barcode": "GHI", "date_associated": "2017-11-27 23:59:59", "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59"]';

   WHILE v1 < 4 DO
     SET @data_v = JSON_EXTRACT(@j, concat('$[',v1,']'));
     INSERT INTO database.table_name (`ID`, `Text`) VALUES (NULL, @data_v );
     SET v1 = v1 + 1;
   END WHILE;
  END

【讨论】:

这是纯粹在 MySQL 中完成的吗?因为目标是完全在 MySQL(数据库服务器)中独立完成 更新答案请查看。这将像这样保存行: 1. "LCM": "id": 333, "barcode": "ABC", "DCover": "id": 444, "barcode": "CDE", “日期关联”:“2017-11-27 23:59:59” 2. “LCM”:“id”:555,“条形码”:“EFG”,“DOver”:“id”:666 , "barcode": "GHI", "date_associated": "2017-11-27 23:59:59" 3. "LCM": "id": 777, "barcode": "IJK", "DCover": "id": 888, "barcode": "KLM", "date_associated": "2017-11-27 23:59:59" 嗯,我正在寻找一个 MySQL 服务器端的解决方案。不涉及任何语言细节。

以上是关于如何从 MySQL 中提取 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中的 JSON 数组内的元素中提取特定属性的所有值?

如何从PostgreSQL json中提取数组

如何从 BigQuery 中的 JSON 字符串中提取数组

从 Json 数组中提取 JSON 对象到 mysql 8

从 MySQL JSON 列中提取 JSON 对象的值作为数组

如何从 JSON.NET 的 JsonArray 中提取单个数组成员?