0

我将数据直接从 Postgres 数据库提取到 R 中,其中 Postgres 表中的一列包含 JSON 对象的行。我正在尝试解压缩 JSON 对象并将它们展平为 R 数据框中的列,但到目前为止,我得到的结果是错误的。

这是我的代码:

library(RPostgreSQL)
library(jsonlite)

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="xxx", dbname="xxx", user="xxx", password="xxx")
query="select column1, column2, json from dummy_table limit 2" 
resultSet <- dbSendQuery(con, query)
rawData<-fetch(resultSet,n=-1)
postgresqlCloseConnection(con)

rawData$json
[1]"{\"id\":{\"publisherName\":\"pub1\",\"visitorId\":\"visitor1\",\"timestamp\":1234},\"startAt\":4567,\"endAt\":8910}"
[2]"{\"id\":{\"publisherName\":\"pub2\",\"visitorId\":\"visitor2\",\"timestamp\":2345},\"startAt\":678,\"endAt\":91011}"

unpacked<-fromJSON(rawData$json, simplifyDataFrame=FALSE)

unpacked
$id
$id$publisherName
[1] "pub1"
$id$visitorId
[1] "visitor1"
$id$timestamp
[1] 1234
$startAt
[1] 4567
$endAt
[1] 8910

正如你所看到的,它只解包了第一个 JSON 对象,并且它留下了准嵌套的东西(这很好,但最好是,我希望所有数据都存在于数据帧中的一个级别中)。

我希望数据看起来像这样:

unpacked

id.publisherName     id.visitorId     id.timestamp     startAt       endAt
pub1                 visitor1         1234             4567          8910
pub2                 visitor2         2345             678           91011

编辑:添加 rawData 数据框:

rawData<-structure(list(
  column1 = c("abcd", "efgh"
), 
column2 = structure(c(123, 456), class = c("POSIXct", 
"POSIXt"), tzone = ""), 
json = c("{\"id\":{\"publisherName\":\"pub1\",\"visitorId\":\"visitor1\",\"timestamp\":1234},\"startAt\":4567,\"endAt\":8910}", 
"{\"id\":{\"publisherName\":\"pub2\",\"visitorId\":\"visitor2\",\"timestamp\":2345},\"startAt\":678,\"endAt\":91011}"
))
, .Names = c("column1", "column2", "json"), 
row.names = 1:2, class = "data.frame")

这是函数发生的情况paste

rawJSON <- paste("[", paste(rawData$json, collapse=","), "]")
rawJSON <- fromJSON(rawJSON, simplifyDataFrame=FALSE)

rawJSON
[[1]]
[[1]]$id
[[1]]$id$publisherName
[1] "pub1"

[[1]]$id$visitorId
[1] "visitor1"

[[1]]$id$timestamp
[1] 1234


[[1]]$startAt
[1] 4567

[[1]]$endAt
[1] 8910


[[2]]
[[2]]$id
[[2]]$id$publisherName
[1] "pub2"

[[2]]$id$visitorId
[1] "visitor2"

[[2]]$id$timestamp
[1] 2345


[[2]]$startAt
[1] 678

[[2]]$endAt
[1] 91011
4

1 回答 1

1

fromJSON函数假定您正在为其提供一个完整的json字符串。字符向量将被折叠成单个字符串。在您的情况下,您的数据包含多个单独的json对象。因此,您要么需要单独转换它们:

lapply(rawData$json, fromJSON)

或者,要获得您想要的结果,请使用stream_in将它们解析为 ndjson。

mydata <- jsonlite::stream_in(textConnection(rawData$json))
fromJSON(myjson)

有关更多详细信息,请参阅 jsonlite?stream_in手册页。

于 2014-03-13T15:58:35.333 回答