在R语言中合并多API嵌套JSON数据至DataFrame的问题求助
解决方案:合并员工API数据到现有DataFrame
问题分析
你需要将单个员工API返回的department、顶级部门、rooms字段合并到已获取的employees DataFrame中,但之前的尝试存在以下问题:
- 循环中未正确提取目标字段,直接合并不同结构的数据导致失败
- 新建DataFrame时丢失了原
employees的大部分属性 - 未处理API请求失败的异常,也未正确解析
rooms这类数组型字段
完整可运行代码
library(jsonlite) library(httr) library(dplyr) library(purrr) # 1. 获取基础员工列表数据 api_endpoint <- "https://at.tuke.sk/api/employee" params <- list(query = "data", type = "json") response <- GET(api_endpoint, query = params) employees <- fromJSON(content(response, "text"), flatten = TRUE) %>% distinct(idEmployee, .keep_all = TRUE) # 去重并保留所有字段 # 2. 定义函数:根据员工ID获取额外信息 get_employee_extra <- function(emp_id) { api_url <- paste0("https://at.tuke.sk/api/employee/", emp_id) # 处理请求异常 resp <- tryCatch( GET(api_url), error = function(e) NULL ) if (is.null(resp) || http_status(resp)$category != "Success") { # 请求失败时返回NA占位 return(tibble( idEmployee = emp_id, department = NA_character_, top_level_department = NA_character_, rooms = NA_character_ )) } # 解析单个员工的API返回数据 emp_data <- fromJSON(rawToChar(resp$content), flatten = TRUE) # 提取目标字段(需根据API实际返回结构调整) dept_name <- emp_data$department$name %||% NA_character_ # 假设顶级部门是department的parent节点名称,可根据实际API修改 top_dept_name <- emp_data$department$parent$name %||% emp_data$department$topLevelName %||% NA_character_ # 将rooms数组转为逗号分隔字符串,也可保留原始列表结构 rooms_str <- if (!is.null(emp_data$rooms)) paste(emp_data$rooms$name, collapse = ", ") else NA_character_ tibble( idEmployee = emp_id, department = dept_name, top_level_department = top_dept_name, rooms = rooms_str ) } # 3. 批量获取所有员工的额外信息 employees_extra <- map_dfr(employees$idEmployee, get_employee_extra) # 4. 合并基础数据与额外信息 final_employees <- employees %>% left_join(employees_extra, by = "idEmployee") # 查看合并结果 head(final_employees)
关键说明
- 使用
distinct()替代手动去重,代码更简洁规范 - 用
tryCatch()捕获API请求异常,避免程序中途中断 - 采用
purrr::map_dfr()批量处理员工ID,效率远高于循环rbind,且自动拼接为DataFrame - 若API返回的顶级部门、rooms字段结构与代码假设不符,需对应修改字段提取逻辑
rooms字段转为字符串是为了方便查看,若需保留原始数组结构,可直接返回emp_data$rooms
内容的提问来源于stack exchange,提问作者99MushrooM99
相关产品推荐
相关产品推荐

