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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:52:18