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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:06:07