这是原始json数据:
json_file <- '{"name":"Doe, John","group":"Red","age":{"v_0":24}}
{"name":"Doe, Jane","group":"Green","age":{"v_0":31}}
{"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}'
Run Code Online (Sandbox Code Playgroud)
当我想转换json_file为数据框时:
library(RJSONIO)
json_file <- fromJSON(json_file)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error: parse error: trailing garbage
:"Red","age":{"v_0":24}} {"name":"Doe, Jane","group":"Gr
(right here) ------^
Run Code Online (Sandbox Code Playgroud)
我知道如果我将原始数据更改为以下数据,一切都会好起来的:
json_file <- '[{"name":"Doe, John","group":"Red","age":{"v_0":24}},
{"name":"Doe, Jane","group":"Green","age":{"v_0":31}},
{"name":"Smith, Joan","group":"Yellow","age":{"v_0":22}}]'
Run Code Online (Sandbox Code Playgroud)
但实际上我想知道:
1)如何从原始数据中获取数据框而不使用[,,和分割其对象]?
2)如果没有办法,如何json通过添加,到除最后一行之外的每一行的末尾以及在文件的第一行和最后一行添加[and来分割大文件中的对象?]
有多种方法可以做到这一点,而无需编辑文件。
如果你想要一个数据框:
library(jsonlite)
# url
zips <- stream_in(url("http://media.mongodb.org/zips.json"))
# file
json_data <- stream_in(file("path/to/file.json"))
Run Code Online (Sandbox Code Playgroud)
或者如果你想要一个列表:
json_data_as_list <- readLines("path/to/file.json") %>% lapply(fromJSON)
Run Code Online (Sandbox Code Playgroud)
您的原始 json 数据已拆分为单独的对象。最重要的是,作为一个整体,json 数据是无效的。幸运的是,正如您所注意到的,如果您,在每行末尾插入(最后一行除外)并将其全部括在方括号中,您将获得密钥对(或数组)的集合。所以你应该问,“我如何将所有元素合并到一个 data.frame 中?”
解决方案:dplyr::bind_rows(fromJSON(json_file))
# A tibble: 3 x 3
name group age
<chr> <chr> <dbl>
1 Doe, John Red 24
2 Doe, Jane Green 31
3 Smith, Joan Yellow 22
Run Code Online (Sandbox Code Playgroud)
跟进:
假设 json 对象不包含 newlines,您可以进行简单的搜索替换:
json_file <- gsub('\n', ',', trimws(json_file), fixed=TRUE)
Run Code Online (Sandbox Code Playgroud)
我放入trimws来删除可能的尾随换行符。
接下来,用方括号将其括起来:
json_file <- paste0('[', json_file, ']')
Run Code Online (Sandbox Code Playgroud)
你又回到正轨了。