首页 > 解决方案 > 如何从 R 中的 JSON 响应中打印命名列表的列表?

问题描述

我正在用 R 编写一个脚本,它使用一个 Web API,它以大量复杂的 JSON 对象返回数据,类似于:

[
    {
        "runIds": [9505160, 89098],
        "fileCount": 2,
        "runTime": 1.469,
        "requestCount": 1
    },
    {
        "runIds": [12, 13, 14],
        "fileCount": 1,
        "runTime": 2.9,
        "requestCount": 10
    }
]

我正在使用 httr R 包执行 GET 请求,该请求获取此数据并将其作为列表列表返回。如果您不熟悉响应格式,请检查此虚拟 R 示例的输出:

library(httr)
response = GET("https://jsonplaceholder.typicode.com/users")
content(response)

打印如下内容:

[[10]]$company
[[10]]$company$name
[1] "Hoeger LLC"

[[10]]$company$catchPhrase
[1] "Centralized empowering task-force"

[[10]]$company$bs
[1] "target end-to-end models"
(...)

打印出来的回复很难阅读。有没有办法在 R 中以“美化”的方式打印这个列表(列表等)?

标签: rhttr

解决方案


使用jsonlite包,您可以将其转换为数据框。

library(httr)

   response = GET("https://jsonplaceholder.typicode.com/users")

   my_json_text <-content(response,as="text") 

library(jsonlite)

   my_df_output <- fromJSON(my_json_text)

   head(my_df_output,2)

这使,

  id          name  username             email address.street address.suite address.city address.zipcode address.geo.lat address.geo.lng                 phone       website    company.name
1  1 Leanne Graham      Bret Sincere@april.biz    Kulas Light      Apt. 556  Gwenborough      92998-3874        -37.3159         81.1496 1-770-736-8031 x56442 hildegard.org Romaguera-Crona
2  2  Ervin Howell Antonette Shanna@melissa.tv  Victor Plains     Suite 879  Wisokyburgh      90566-7771        -43.9509        -34.4618   010-692-6593 x09125 anastasia.net    Deckow-Crist
                     company.catchPhrase                       company.bs
1 Multi-layered client-server neural-net      harness real-time e-markets
2         Proactive didactic contingency synergize scalable supply-chains

编辑:

如果文件在列表中包含列表,我们实际上可以做同样的事情,例如,

data <- '[
    {
        "runIds": [9505160, 89098],
        "fileCount": 2,
        "runTime": 1.469,
        "requestCount": 1
    },
    {
        "runIds": [12, 13, 14],
        "fileCount": 1,
        "runTime": 2.9,
        "requestCount": 10
    }
]'

 data2 <- fromJSON(data)

如果我们打电话data2

data2
          runIds fileCount runTime requestCount
1 9505160, 89098         2   1.469            1
2     12, 13, 14         1   2.900           10


sapply(data2,class)

      runIds    fileCount      runTime requestCount 
      "list"    "integer"    "numeric"    "integer" 

它是列表格式。所以我们可以将它作为列表格式存储在我们的数据帧中,这与输出相比更美化content(),或者我们可以更喜欢将其转换为纯数据帧,

library(tidyverse)

data2 %>% unnest(runIds)

这使,

  fileCount runTime requestCount  runIds
1         2   1.469            1 9505160
2         2   1.469            1   89098
3         1   2.900           10      12
4         1   2.900           10      13
5         1   2.900           10      14

推荐阅读