如何在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
相关产品推荐
相关产品推荐

