如何将法国公共资助项目API的JSON数据转换为规范DataFrame?
解决JSON转数据框并导出CSV的问题
问题背景
需要将法国公共资助项目列表转为CSV文件,已通过API获取JSON数据:
my_url <- "https://aides-territoires.beta.gouv.fr/api/aids/all/" results <- httr::content( httr::GET(my_url), as="text", httr::content_type_json(), encoding= "UTF-8" )
尝试手动提取字段转数据框时,出现错误:
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 1, 2, 0, 3, 4, 11, 7, 5, 15
错误原因是部分字段(如financers、instructors)是嵌套列表/多值数组,直接提取后每个字段的长度不一致,无法构造数据框。
解决方案步骤
1. 正确解析JSON数据
先用jsonlite::fromJSON解析JSON文本,它自带处理嵌套结构的能力:
library(jsonlite) library(dplyr) # 解析JSON,flatten参数自动展开嵌套层级 parsed_data <- fromJSON(results, flatten = TRUE) # 提取API返回的核心项目数据 aids_data <- parsed_data$results
2. 处理多值字段
把包含多个元素的列表型字段(比如资助方、执行方名称)合并为逗号分隔的字符串,保证所有字段长度一致:
aids_data <- aids_data %>% mutate( financers = sapply(financers, function(x) paste(x$name, collapse = ", ")), instructors = sapply(instructors, function(x) paste(x$name, collapse = ", ")), programs = sapply(programs, function(x) paste(x$name, collapse = ", ")), destinations = sapply(destinations, function(x) paste(x$name, collapse = ", ")) )
3. 导出为CSV文件
处理完成后直接转为数据框并导出:
# 转为标准数据框(解析后若已是数据框可跳过此步) aids_df <- as.data.frame(aids_data) # 导出CSV,保留UTF-8编码避免乱码 write.csv(aids_df, "法国公共资助项目列表.csv", row.names = FALSE, fileEncoding = "UTF-8")
补充说明
flatten = TRUE会将嵌套的JSON结构展开为顶层字段(如financers.name),简化后续处理- 空值或长度为0的列表会被转为空字符串,不会触发报错
- 若需要拆分多值字段生成多行数据,可改用
tidyr::unnest函数
内容的提问来源于stack exchange,提问作者Victor Philippon
相关产品推荐
相关产品推荐

