jsonlite没有正确地从Postgres解包JSON

时间:2014-03-12 21:45:34

标签: json r postgresql jsonlite

我将数据直接从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

1 个答案:

答案 0 :(得分:1)

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

lapply(rawData$json, fromJSON)

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

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

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