使用jsonlite读取jsPsych输出JSON文件报错,求解决
解决jsonlite读取jsPsych JSON文件的词法错误
问题场景
使用jsonlite库读取文件夹内所有jsPsych输出的JSON文件,合并为单个R dataframe时触发以下错误:
lexical error: invalid char in json text.
subject-64518a37ad8eb.json
(right here) ------^
原代码如下:
library(jsonlite) dataset <- data.frame() for (i in 1:length(file_list)) { cat(i," ") temp_data <- fromJSON(file_list[i]) dataset <- rbind(dataset, temp_data) } head(dataset)
错误原因
报错核心是fromJSON()把文件名字符串当成了JSON文本解析,而非读取对应路径的文件内容。通常由以下原因导致:
file_list仅存储文件名,而非完整文件路径,且文件不在当前工作目录下- 当前工作目录设置错误,R无法定位目标文件
file_list中混入了非JSON文件路径
解决方案
1. 生成带完整路径的有效文件列表
用list.files()指定full.names=TRUE获取完整文件路径,同时通过pattern筛选仅JSON文件:
# 替换为你的JSON文件所在文件夹路径 target_dir <- "./jsPsych_data" # 获取所有JSON文件的完整路径 file_list <- list.files(path = target_dir, pattern = "\\.json$", full.names = TRUE)
2. 高效批量读取与合并
避免循环rbind(效率低,尤其文件数量多),改用lapply批量读取后用dplyr::bind_rows合并,同时处理jsPsych JSON的嵌套结构:
library(jsonlite) library(dplyr) # 读取并扁平化嵌套JSON结构 read_jsons <- function(file_path) { fromJSON(file_path, flatten = TRUE) } # 批量读取所有文件 data_list <- lapply(file_list, read_jsons) # 合并为单个dataframe dataset <- bind_rows(data_list) head(dataset)
3. 安全性检查(可选)
添加文件存在性校验,避免因无效路径报错:
data_list <- lapply(file_list, function(path) { if (file.exists(path)) { fromJSON(path, flatten = TRUE) } else { warning(paste("文件不存在:", path)) NULL } }) # 过滤空值后合并 dataset <- bind_rows(Filter(Negate(is.null), data_list))
关键说明
- jsPsych输出的JSON多包含嵌套结构,
flatten=TRUE可将嵌套字段展开为dataframe的列 lapply+bind_rows的组合比循环rbind性能更优,适合处理大量文件
内容的提问来源于stack exchange,提问作者Elisa Scerrati
相关产品推荐
相关产品推荐

