我输入了一个名为in.json的文件。您可以找到此文件的内容here
使用此answer我尝试使用以下代码将json转换为csv:
require(RJSONIO)
require(rjson)
library("rjson")
filename2 <- "C:/Users/Desktop/in.json"
json_data <- fromJSON(file = filename2)
json_data <- lapply(json_data, function(x) {
x[sapply(x, is.null)] <- NA
unlist(x)
})
json <- do.call("rbind", json_data)
df=json
write.csv(df,file='C:/Users/Desktop/final.csv', row.names=FALSE)
然而,当我输入nrow(df)时,我可以看到我只有2行,但根据项目的每个id,我需要更多的行。
答案 0 :(得分:2)
您提供的json作为示例确实在数组中只有两个对象。该结构忠实地显示为被调用str
:
> str(json_data,max.level=2)
List of 2
$ :List of 3
..$ projects :List of 1
..$ total_hits: num 12596
..$ seed : chr "776766"
$ :List of 3
..$ projects :List of 16
..$ total_hits: num 12596
..$ seed : chr "776766"
猜测你的意思是项目ID,并且你不介意放弃&#34; total_hits&#34;和 你只需要取消json的前两个级别:
unlisted <- unlist(unlist(json_data,recursive=FALSE),recursive=FALSE)
然后选择名为projects *的项目:
projects <- unlisted[grep("^projects*",names(unlisted))]
然后您可以使用以下方式取消列出:
data <- lapply(projects,unlist)
Rbinding比较棘手,因为你没有在所有项目中填写完全相同的字段,你需要依赖名称,以下是众多解决方案中的一个,可能不是最佳解决方案之一:
# list all the names in all projects
allNames <- unique(unlist(lapply(data,names)))
# have a model row
modelRow <- rep(NA,length(allNames))
names(modelRow)<-allNames
# the function to change your list into a row following modelRow structure
rowSettingFn <- function(project){
row <- modelRow
for(iItem in 1:length(project)){
row[names(project)[iItem]] <- project[[iItem]]
}
return(row)
}
# change your data into a matrix
dataMat <- sapply(data,rowSettingFn)