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

如何在R语言中解析格式异常的JSON数据

解决多个独立JSON对象转DataFrame的问题

你遇到的问题很典型:你的JSON数据是多个独立的JSON对象直接拼接,没有用数组[]包裹,这不符合标准JSON的语法规则(标准JSON只能有一个根元素),所以解析器会报"multiple roots"或者"trailing garbage"的错误。

下面给你几个在R里快速解决的方案:

方法1:使用jsonlite的stream_in(最简便)

jsonlite包的stream_in函数专门用来处理这种**每行一个JSON对象(或无换行的拼接对象)**的NDJSON格式,直接读取并转换成DataFrame:

library(jsonlite)

# 读取文件并转换
con <- file("data/part-f1.json")
df <- stream_in(con)
close(con)

这个方法会自动处理多个独立的JSON对象,不需要手动修改文件内容。

方法2:手动修复JSON格式后用fromJSON读取

如果你想先把文件转换成标准JSON数组,可以先读取文件内容,做字符串替换,再解析:

library(jsonlite)

# 读取文件内容
json_content <- readLines("data/part-f1.json", warn = FALSE)
# 把拼接的对象分隔符替换成数组元素分隔符,前后加数组括号
fixed_json <- paste0("[", gsub("\\}\\{", "},{", paste(json_content, collapse = "")), "]")
# 解析成DataFrame
df <- fromJSON(fixed_json, flatten = TRUE)

这个方法适合需要先修改JSON文件内容的场景,比如后续要用到标准JSON格式的情况。

方法3:逐个解析单个JSON对象

如果你的JSON对象之间有明确的分隔(比如换行),也可以逐个读取每个对象再合并:

library(jsonlite)

# 按行读取每个JSON对象
json_lines <- readLines("data/part-f1.json")
# 逐个解析并合并成DataFrame
df <- do.call(rbind, lapply(json_lines, fromJSON))

不过注意如果你的文件里没有换行(像你提供的示例那样是完全拼接在一起的),这个方法需要先把字符串分割成单个JSON对象,这时候方法1或2更合适。

为什么之前的fromJSON会报错?

你之前用的fromJSON函数默认要求输入是标准JSON格式,也就是只能有一个根元素(要么是一个对象,要么是一个数组),而你的数据是多个对象直接连在一起,所以解析到第一个对象结束后,遇到第二个对象的{就会认为是"trailing garbage"(多余的垃圾内容),从而报错。

内容的提问来源于stack exchange,提问作者mgloss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:29:55