Tidyjson:有一个' exit_object()'当量?

时间:2016-02-04 10:47:07

标签: json r

我使用包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"))

2 个答案:

答案 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中一个被忽视的功能是能够在jnumberjstring等函数中使用更复杂的路径。

如果没有&#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')
  )