You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python动态拆分JSON响应的Details字段生成多列DataFrame

处理API响应数据:生成DataFrame或SQL数据表

Python 生成 DataFrame

直接通过拆分Details字段为字典,再与原字段合并即可实现动态列生成:

  • 先获取API响应数据(这里用模拟数据示例,实际替换为你的API请求代码):
import requests
import pandas as pd

# 模拟API响应(实际用requests.get(url).json()获取)
api_response = {
    "posts": [
        {"ID": 1, "Details": "Author:Alice;Category:Tech;Views:100"},
        {"ID": 2, "Details": "Author:Bob;Status:Published;Likes:50"},
        {"ID": 3, "Details": "Category:Life;Tags:Travel;Comments:10"}
    ]
}
  • 处理每个post的Details字段,拆分为键值对字典,再与原ID合并:
processed_posts = []
for post in api_response["posts"]:
    # 拆分Details为键值对,兼容值中含冒号的情况
    details_dict = {}
    for item in post["Details"].split(";"):
        if ":" in item:
            key, value = item.split(":", 1)
            details_dict[key.strip()] = value.strip()
    # 合并原ID和拆分后的字典
    processed_post = {"ID": post["ID"], **details_dict}
    processed_posts.append(processed_post)

# 生成DataFrame,缺失字段自动填充为NaN
df = pd.DataFrame(processed_posts)
print(df)

SQL 创建数据表

由于Details的键不固定,需先提取所有可能的键,再动态创建表结构并插入数据。以下以MySQL为例:

步骤1:提取所有唯一键

  • 先创建临时表存储原始API数据:
-- 创建临时表
CREATE TEMPORARY TABLE temp_posts (id INT, details TEXT);
-- 插入模拟数据(实际替换为API数据的插入逻辑)
INSERT INTO temp_posts VALUES
(1, 'Author:Alice;Category:Tech;Views:100'),
(2, 'Author:Bob;Status:Published;Likes:50'),
(3, 'Category:Life;Tags:Travel;Comments:10');

-- 提取所有唯一的键
SELECT DISTINCT TRIM(SUBSTRING_INDEX(item, ':', 1)) AS key_name
FROM temp_posts,
     JSON_TABLE(
         CONCAT('["', REPLACE(details, ';', '","'), '"]'),
         "$[*]" COLUMNS(item TEXT PATH "$")
     ) AS jt
WHERE item LIKE '%:%';

步骤2:动态创建目标表

  • 通过存储过程自动拼接表结构:
DELIMITER //
CREATE PROCEDURE create_posts_table()
BEGIN
    -- 拼接所有动态列的定义
    SET @columns = '';
    SELECT GROUP_CONCAT(DISTINCT CONCAT('`', TRIM(SUBSTRING_INDEX(item, ':', 1)), '` VARCHAR(255)'))
    INTO @columns
    FROM temp_posts,
         JSON_TABLE(
             CONCAT('["', REPLACE(details, ';', '","'), '"]'),
             "$[*]" COLUMNS(item TEXT PATH "$")
         ) AS jt
    WHERE item LIKE '%:%';

    -- 执行建表语句
    SET @create_sql = CONCAT('CREATE TABLE posts (id INT PRIMARY KEY, ', @columns, ')');
    PREPARE stmt FROM @create_sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

-- 调用存储过程创建表
CALL create_posts_table();

步骤3:插入拆分后的数据

  • 用存储过程动态拆分并插入数据:
DELIMITER //
CREATE PROCEDURE insert_posts_data()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE post_id INT;
    DECLARE post_details TEXT;
    DECLARE cur CURSOR FOR SELECT id, details FROM temp_posts;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO post_id, post_details;
        IF done THEN
            LEAVE read_loop;
        END IF;

        -- 拆分details为键值对,拼接插入语句
        SET @items = CONCAT('["', REPLACE(post_details, ';', '","'), '"]');
        SELECT GROUP_CONCAT('`', TRIM(SUBSTRING_INDEX(item, ':', 1)), '`'),
               GROUP_CONCAT('''', TRIM(SUBSTRING_INDEX(item, ':', -1)), '''')
        INTO @key_list, @value_list
        FROM JSON_TABLE(@items, "$[*]" COLUMNS(item TEXT PATH "$")) AS jt
        WHERE item LIKE '%:%';

        SET @insert_sql = CONCAT('INSERT INTO posts (id, ', @key_list, ') VALUES (', post_id, ', ', @value_list, ')');
        PREPARE stmt FROM @insert_sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP;
    CLOSE cur;
END //
DELIMITER ;

-- 调用存储过程插入数据
CALL insert_posts_data();

内容的提问来源于stack exchange,提问作者AH.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:05:39