MySQL 树结构json转table

  虽然MySQL5.7开始原生支持json格式数据,但是如果需要把数据库表中的树结构json解析转成相应树表结构的话,一般是通过c#、java、js等语言解析完成再写入table的。其实,在MySQL内部,不需借助其它语言,就能完成转换。

  • 多层嵌套json数据示例

  以下json字符串存储在treejson表的tree字段中

{
    "children" : [
    {
        "id" : 2,
        "name" : "西安",
        "children" : []
    }
    ],
    "id" : 1,
    "name" : "陕西"
}
  • treejson结构

列名---数据类型---描述
num---INT(11)-----自增id
id-------INT(11)-----treeId
tree----JSON-------treeJson

  • 使用表treetable接收转换后的数据

列名---数据类型---描述
num-----INT(11)------------自增id
rootId---INT(11)------------tree根节点id
id--------INT(11)-------------treeNodeId
pId------INT(11)-------------treePNodeId
name---VARCHAR(45)---nodeName
path-----VARCHAR(50)---nodePath
level-----TINYINT(2)-------nodeLevel

  • 使用存储过程转换

  

CREATE DEFINER=`root`@`localhost` PROCEDURE `extractjson`(IN jsonPath varchar(100), IN treePath varchar(50), IN parentId int, IN treeLevel int, IN treeJsonId int)
BEGIN
# 当前节点id
DECLARE tempId INT DEFAULT '0';
# 当前节点下属的子节点数目
DECLARE childrenLen INT DEFAULT '0';
# 当前节点下属的子节点json的解析路径
DECLARE nextJsonPath varchar(100) DEFAULT '';

# 设置变量值
SET tempId = (SELECT JSON_EXTRACT(tree,CONCAT(jsonPath,'.id')) FROM treejson WHERE id = treeJsonId);
SET childrenLen = (SELECT JSON_LENGTH(tree,CONCAT(jsonPath,'.children')) FROM treejson WHERE id = treeJsonId);
# 内置参数必要的递归层深限制
SET @@max_sp_recursion_depth = 100;

# 把当前节点插入到数据表
INSERT INTO treetable(rootId,id,pId,name,path,level)
  SELECT JSON_EXTRACT(tree,'$.id') AS rootId
    ,tempId AS id
    ,parentId AS pId
    ,JSON_EXTRACT(tree,CONCAT(jsonPath,'.name')) AS name
    ,CONCAT(treePath,',',tempId) AS path
    ,(treeLevel + 1) AS level
  FROM treejson
  WHERE treejson.id = treeJsonId;
# 循环把所有子节点插入数据表
WHILE childrenLen > 0 DO
  SET nextJsonPath = CONCAT(jsonPath, '.children[', childrenLen - 1, ']');
  CALL extractjson(nextJsonPath, CONCAT(treePath,',',tempId), tempId, (treeLevel + 1), treeJsonId);
  SET childrenLen = childrenLen - 1;
END WHILE;
END

 

转载于:https://www.cnblogs.com/shanyuqin/p/11415060.html

Java中,将MySQL表结构换成JSON格式的数据,通常需要几个步骤:连接数据库、获取表结构信息、生成JSON数据。这通常可以通过以下两种方式实现: 1. 手动编码:使用JDBC(Java数据库连接)API连接到MySQL数据库,然后使用`DatabaseMetaData`获取表结构信息,如表名、列名、列类型等。之后,你可以根据获取到的表结构信息构建相应的JSON对象。例如,使用`JSONObject`和`JSONArray`类(这些类来自于如org.json或者com.alibaba.fastjson等库)来构建JSON结构,并填充表中的数据。 2. 使用第三方库:有现成的第三方库可以简化这个过程,如MyBatis、Hibernate等ORM框架,或者是专门用于生成JSON的库。这些库往往提供了一些工具或API,可以更方便地将数据库表结构和数据换为JSON格式。 一个示例代码如下(使用JDBC和org.json库): ```java import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import org.json.JSONArray; import org.json.JSONObject; public class TableToJSON { public static void main(String[] args) { String jdbcURL = "jdbc:mysql://localhost:3306/your_database"; String username = "your_username"; String password = "your_password"; Connection connection = null; try { connection = DriverManager.getConnection(jdbcURL, username, password); DatabaseMetaData metaData = connection.getMetaData(); JSONArray jsonArray = new JSONArray(); ResultSet tables = metaData.getTables(null, null, "%", null); while (tables.next()) { String tableName = tables.getString("TABLE_NAME"); JSONObject jsonObject = new JSONObject(); jsonObject.put("table_name", tableName); // 添加表的其他信息,如列名、列类型等 // ... jsonArray.put(jsonObject); } System.out.println(jsonArray.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (connection != null) connection.close(); } catch (Exception e) { e.printStackTrace(); } } } } ``` 在实际应用中,你可能还需要添加异常处理,确保数据库连接正确关闭,并且处理可能发生的SQL异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值