R读取JSON文件报expect ',' or '}'错误的解决方法求助
问题原因
你的报错由两个核心问题共同导致:
- JSON内容被异常插入空格破坏语法:所有数字、字符串的单个字符之间都被插入了空格,比如合法的数字
2200被拆为2 2 0 0,合法的字符串1-2-dry.de被拆为1 - 2 - d r y . d e,JSON解析器无法识别这类不符合规范的值,你收到的报错指向的就是被拆分的数字位置,解析器读取到第一个数字2后,无法识别后续空格加2的内容,因此抛出格式错误。 - 文件为多JSON对象格式:文件内包含两个独立的JSON对象,既没有用逗号分隔,也没有包裹在数组中,普通单JSON解析逻辑无法直接处理。
解决步骤
你可以先读取原始文本做格式清理,再逐行解析JSON,最终合并为data.table,完整可运行代码如下:
# 加载依赖包,未安装可先执行 install.packages(c("jsonlite", "data.table")) library(jsonlite) library(data.table) # 1. 读取原始文件全部内容 raw_text <- readLines("/替换为你的文件实际路径/filename.json", warn = FALSE) raw_text <- paste(raw_text, collapse = "") # 2. 清理异常插入的空格 ## 清理数字之间的空格,把2 2 0 0还原为2200 clean_text <- gsub("(?<=\\d) (?=\\d)", "", raw_text, perl = TRUE) ## 清理字母/连接符之间的单个空格,保留连续空格(原文本中单词之间的连续空格为正常分隔) clean_text <- gsub("(?<=[a-zA-Z.\\-]) (?=[a-zA-Z.\\-])", "", clean_text, perl = TRUE) ## 清理JSON键名两侧的多余空格,把" D "还原为"D" clean_text <- gsub('"\\s*([^"]+?)\\s*"', '"\\1"', clean_text, perl = TRUE) # 3. 拆分多个独立JSON对象 json_lines <- strsplit(clean_text, "}\\{")[[1]] ## 补全每个JSON对象的首尾括号 json_lines <- ifelse(!startsWith(json_lines, "{"), paste0("{", json_lines), json_lines) json_lines <- ifelse(!endsWith(json_lines, "}"), paste0(json_lines, "}"), json_lines) # 4. 逐行解析JSON,合并为data.table parse_list <- lapply(json_lines, function(x) { parsed <- fromJSON(x) # 展开嵌套的T数组,和外层字段合并 dt <- as.data.table(parsed$T) dt[, `:=`(D = parsed$D, SP = parsed$SP, FI = parsed$FI, LI = parsed$LI)] return(dt) }) final_dt <- rbindlist(parse_list, fill = TRUE)
如果运行后仍有格式问题,可以先打印clean_text的前几百个字符,检查清理后的JSON格式是否符合规范,再针对性调整正则规则即可。
内容的提问来源于stack exchange,提问作者datawranglerCL
相关产品推荐
相关产品推荐

