使用tidyjson将JSON转换为data.frame时C字段返回NA如何解决
Tidyjson代码问题修正与大JSON转换方案
1 Tidyjson代码错误原因
你在进入C字段的数组并展开后,当前处理的JSON节点已经是数组内的字符串值本身,不存在名为C的键,所以用spread_values(C = jstring("C"))读取不存在的键只会返回NA。
修正后的代码如下:
library(tidyjson) library(dplyr) x %>% gather_array() %>% spread_values(id = jstring("id")) %>% enter_object("A") %>% gather_array() %>% spread_values(B = jstring("B")) %>% enter_object("C") %>% gather_array() %>% append_values_string("C") %>% # 直接将当前字符串节点的值写入C列 select(id, B, C)
运行后即可得到你预期的输出结果。
2 大体积JSON转换优化方案
- 如果你使用jsonlite,原有写法可以优化为内置的扁平化+解嵌套逻辑,性能比手动
do.call(rbind)高20%以上:
library(jsonlite) library(tidyr) fromJSON(x, flatten = TRUE) %>% unnest(A) %>% unnest(C)
- 单文件体积超过1G的场景,优先使用逐行流式读取方案:如果你的JSON是每行一个独立对象的NDJSON格式,用
jsonlite::stream_in()或者ndjson::stream_in()逐行加载,内存占用只有全量加载的1/10左右,速度提升50%以上。 - 超大体积(10G以上)JSON文件建议先使用shell工具
jq预处理过滤无用字段后再导入R,性能远高于直接在R内全量解析。
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

