我使用包tidyjson
来解析json字符串并将键值提取到列中。嵌套的json,虽然我可以在一个节点上向下钻取,但我无法找到一种方法可以达到上一级别。代码如下:
library(tidyjson)
library(data.table)
library(dplyr)
input <- '{
"name": "Bob",
"age": 30,
"social": {
"married": "yes",
"kids": "no"
},
"work": {
"title": "engineer",
"salary": 5000
}
}'
output <- input %>% as.tbl_json() %>%
spread_values(name = jstring("name"),
age = jnumber("age")) %>%
enter_object("social") %>%
spread_values(married = jstring("married"),
kids = jstring("kids")) %>%
#### I would need an exit_obeject() here
enter_object("work") %>%
spread_values(title = jstring("title"),
salary = jnumber("salary"))
答案 0 :(得分:3)
documentation中有一条注释:
“请注意,通常情况下会有多个阵列 或者存在于JSON的同一级别的不同类型的对象 层次结构。在这种情况下,您需要使用enter_object()来输入每个 它们在不同的管道中创建可以的单独data.frames 然后加入关系。“
因此我一直在进行我的tidyjson命令并将输出与合并放在一起,例如:
# first the high-level values
output_table <- input_tbl_json %>%
spread_values(val1 = jstring('val1'),
val2 = jnumber('val2'))
# then enter an object and get something from inside, merging it as a new column
output_table <- merge(output_table,
input_tbl_json %>%
enter_object('thing') %>%
spread_values(val3 = jstring('thing1')),
by = c('document.id'))
输出表列应该看起来像| document.id | val1 | val2 | val3 |
这个工作流可能会因为像gather_keys()这样添加行的操作而失败,但我没有调用它来测试它。
答案 1 :(得分:2)
我认为tidyjson中一个被忽视的功能是能够在jnumber
,jstring
等函数中使用更复杂的路径。
如果没有&#34;输入对象,您可以执行以下操作。&#34;在大多数情况下,我发现这是一个非常令人满意的解决方案。也许比多次进入/退出更令人满意。
input <- '{
"name": "Bob",
"age": 30,
"social": {
"married": "yes",
"kids": "no"
},
"work": {
"title": "engineer",
"salary": 5000
}
}'
output <- input %>% as.tbl_json() %>%
spread_values(
name = jstring('name')
, age=jnumber('age')
, married=jstring('social','married')
, kids = jstring('social','kids')
, title= jstring('work','title')
, salary = jnumber('work','salary')
)