将具有嵌套结构的 JSON 列表折叠成单个 data.frame
Collapse list of JSON with nested structures into single data.frame
我正在尝试解析 API 的一些结果。给定值的 API returns 和 JSON 结果。 API 一次只能处理一个值,所以我 lapply
得到所有结果。 <- 如果这是一个糟糕的起点,很高兴这里有更好的方法!
每个 JSON 响应都有一些嵌套信息。我正在尝试将数据合并为一个 data.frame 并解析嵌套结构。
下午的大部分时间里,我一直在研究 jsonlite 和 purrr,试图让它正常工作并具有理想的弹性。
如何使用 R 将嵌套 json 结构成功转换为 data.frame 用于多个 json documents/records?
MRE
library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)
strSetup <- list(a, b, c)
dfSetup <- data.frame(a, b, c)
jsonStr <- toJSON(rep(strSetup,3))
finalStr <- rbind(dfSetup,dfSetup,dfSetup)
我正在尝试从 jsonStr
到 finalStr
。
如果我没理解错的话,您正在将 API 返回的所有 JSON 字符串存储到一个字符向量中。这意味着您的示例的第 9 行有点偏离,这应该有效。
library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)
strSetup <- list(a, b, c)
dfSetup <- data.frame(a, b, c)
jsonStr <- rep(toJSON(strSetup),3)
finalStr <- rbind(dfSetup,dfSetup,dfSetup)
finalStr2 <- do.call(
what = rbind,
args = lapply(
X = jsonStr,
FUN = function(x){
data.frame(fromJSON(x))
}
)
)
print(all(finalStr == finalStr2))
需要注意的是 names(finalStr) != names(finalStr2)
。但是,我不认为这是可以避免的,因为您指出您从 API 收到的 JSON 字符串不包含名称。
如果我理解有误,请告诉我。
我正在尝试解析 API 的一些结果。给定值的 API returns 和 JSON 结果。 API 一次只能处理一个值,所以我 lapply
得到所有结果。 <- 如果这是一个糟糕的起点,很高兴这里有更好的方法!
每个 JSON 响应都有一些嵌套信息。我正在尝试将数据合并为一个 data.frame 并解析嵌套结构。
下午的大部分时间里,我一直在研究 jsonlite 和 purrr,试图让它正常工作并具有理想的弹性。
如何使用 R 将嵌套 json 结构成功转换为 data.frame 用于多个 json documents/records?
MRE
library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)
strSetup <- list(a, b, c)
dfSetup <- data.frame(a, b, c)
jsonStr <- toJSON(rep(strSetup,3))
finalStr <- rbind(dfSetup,dfSetup,dfSetup)
我正在尝试从 jsonStr
到 finalStr
。
如果我没理解错的话,您正在将 API 返回的所有 JSON 字符串存储到一个字符向量中。这意味着您的示例的第 9 行有点偏离,这应该有效。
library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)
strSetup <- list(a, b, c)
dfSetup <- data.frame(a, b, c)
jsonStr <- rep(toJSON(strSetup),3)
finalStr <- rbind(dfSetup,dfSetup,dfSetup)
finalStr2 <- do.call(
what = rbind,
args = lapply(
X = jsonStr,
FUN = function(x){
data.frame(fromJSON(x))
}
)
)
print(all(finalStr == finalStr2))
需要注意的是 names(finalStr) != names(finalStr2)
。但是,我不认为这是可以避免的,因为您指出您从 API 收到的 JSON 字符串不包含名称。
如果我理解有误,请告诉我。