R: jsonlite 包 - fromJSON 将 json 文件转换为字符而不是预期的列表
R: jsonlite package - fromJSON converts json files to character rather than intended list
鉴于此示例数据框,我可以轻松地将嵌套的 json 文件转换为扁平化列表,然后我可以在后续步骤中将其转换为每个 json 条目一列的数据框:
sample.df.a <- data.frame(json_col = c('[{"foo_a":"_","foo_c":2}]',
'[{"foo_a":"_","foo_b":"_","foo_c":2,"nested_col":{"foo_d":"_","foo_e":3}}]'))
sample.df.a.list <- apply(sample.df.a, 1, jsonlite::fromJSON, flatten = T)
但是我需要使用的实际数据具有以下格式:
sample.df.b <- as.data.frame(apply(sample.df.a, 1, toJSON))
(这是我收到的数据无法更改的方式,并不是此工程示例中 toJSON
转换的结果。当我尝试使用我的实际数据时将嵌套的 json 折叠到列表中(所需的输出,如 sample.df.a.list
所示),而不是 returns 一个字符,我随后无法将其转换为数据框,如下所示:
sample.df.b.list <- apply(sample.df.b, 1, jsonlite::fromJSON, flatten = T)
有谁知道如何从 sample.df.b
创建与 sample.df.a.list
相同类型的折叠列表?
提前致谢!
仅供参考:将列表转换为数据框的后续代码:
library(dpylr)
list.a.as.df <- bind_rows(lapply(sample.df.a.list,data.frame))
您的 sample.df.b
包含您需要的 JSON,但包含在 JSON 数组 ["
和 "]
中。一种方法是使用 'regex'/gsub
删除外括号和引号(以及额外的 \
字符)以获得所需的 JSON。然后你只需调用你通常的代码
sample.df.b <- data.frame(json_col = apply(sample.df.a, 1, toJSON))
sample.df.b$json_col <- gsub('^\[\"|\"\]$|\\', "", sample.df.b$json_col)
apply(sample.df.b, 1, jsonlite::fromJSON, flatten = T)
# [[1]]
# foo_a foo_c
# 1 _ 2
#
# [[2]]
# foo_a foo_b foo_c nested_col.foo_d nested_col.foo_e
# 1 _ _ 2 _ 3
应用fromJSON
两次:
lapply(lapply(as.character(sample.df.b[[1]]), fromJSON), fromJSON, flatten = TRUE)
给予:
[[1]]
foo_a foo_c
1 _ 2
[[2]]
foo_a foo_b foo_c nested_col.foo_d nested_col.foo_e
1 _ _ 2 _ 3
鉴于此示例数据框,我可以轻松地将嵌套的 json 文件转换为扁平化列表,然后我可以在后续步骤中将其转换为每个 json 条目一列的数据框:
sample.df.a <- data.frame(json_col = c('[{"foo_a":"_","foo_c":2}]',
'[{"foo_a":"_","foo_b":"_","foo_c":2,"nested_col":{"foo_d":"_","foo_e":3}}]'))
sample.df.a.list <- apply(sample.df.a, 1, jsonlite::fromJSON, flatten = T)
但是我需要使用的实际数据具有以下格式:
sample.df.b <- as.data.frame(apply(sample.df.a, 1, toJSON))
(这是我收到的数据无法更改的方式,并不是此工程示例中 toJSON
转换的结果。当我尝试使用我的实际数据时将嵌套的 json 折叠到列表中(所需的输出,如 sample.df.a.list
所示),而不是 returns 一个字符,我随后无法将其转换为数据框,如下所示:
sample.df.b.list <- apply(sample.df.b, 1, jsonlite::fromJSON, flatten = T)
有谁知道如何从 sample.df.b
创建与 sample.df.a.list
相同类型的折叠列表?
提前致谢!
仅供参考:将列表转换为数据框的后续代码:
library(dpylr)
list.a.as.df <- bind_rows(lapply(sample.df.a.list,data.frame))
您的 sample.df.b
包含您需要的 JSON,但包含在 JSON 数组 ["
和 "]
中。一种方法是使用 'regex'/gsub
删除外括号和引号(以及额外的 \
字符)以获得所需的 JSON。然后你只需调用你通常的代码
sample.df.b <- data.frame(json_col = apply(sample.df.a, 1, toJSON))
sample.df.b$json_col <- gsub('^\[\"|\"\]$|\\', "", sample.df.b$json_col)
apply(sample.df.b, 1, jsonlite::fromJSON, flatten = T)
# [[1]]
# foo_a foo_c
# 1 _ 2
#
# [[2]]
# foo_a foo_b foo_c nested_col.foo_d nested_col.foo_e
# 1 _ _ 2 _ 3
应用fromJSON
两次:
lapply(lapply(as.character(sample.df.b[[1]]), fromJSON), fromJSON, flatten = TRUE)
给予:
[[1]]
foo_a foo_c
1 _ 2
[[2]]
foo_a foo_b foo_c nested_col.foo_d nested_col.foo_e
1 _ _ 2 _ 3