R:jsonlite包 - fromJSON将json文件转换为字符而不是预期的列表

时间:2018-04-04 10:11:02

标签: r json dataframe jsonlite

鉴于这个示例数据框,我可以轻松地将嵌套的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所示),它返回一个我不能随后转换为数据帧的字符,如下所示:

sample.df.b.list <- apply(sample.df.b, 1, jsonlite::fromJSON, flatten = T)

有谁知道如何从sample.df.a.list创建与sample.df.b相同的折叠列表?

提前致谢!

仅供参考:后续代码将列表转换为数据帧:

library(dpylr)
list.a.as.df <- bind_rows(lapply(sample.df.a.list,data.frame))

2 个答案:

答案 0 :(得分:2)

两次申请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

答案 1 :(得分:1)

您的sample.df.b包含您所需的JSON,但包含在JSON数组[""]中。一种方法是使用'regex'/ gsub来移除外括号和&amp ;;引号(以及额外的\字符)为您提供所需的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