【问题标题】:How to read nested JSON structure?如何读取嵌套的 JSON 结构?
【发布时间】:2015-11-07 03:50:35
【问题描述】:

我有一些如下所示的 JSON:

"total_rows":141,"offset":0,"rows":[
{"id":"1","key":"a","value":{"SP$Sale_Price":"240000","CONTRACTDATE$Contract_Date":"2006-10-26T05:00:00"}},
{"id":"2","key":"b","value":{"SP$Sale_Price":"2000000","CONTRACTDATE$Contract_Date":"2006-08-22T05:00:00"}},
{"id":"3","key":"c","value":{"SP$Sale_Price":"780000","CONTRACTDATE$Contract_Date":"2007-01-18T06:00:00"}},
...

在 R 中,生成 SP$Sale_PriceCONTRACTDATE$Contract_Date 的散点图的最简单方法是什么?

我已经走到这一步了:

install.packages("rjson")
library("rjson")
json_file <- "http://localhost:5984/testdb/_design/sold/_view/sold?limit=100"
json_data <- fromJSON(file=json_file)
install.packages("plyr")
library(plyr)
asFrame <- do.call("rbind.fill", lapply(json_data, as.data.frame))

但现在我被困住了......

> plot(CONTRACTDATE$Contract_Date, SP$Sale_Price)
Error in plot(CONTRACTDATE$Contract_Date, SP$Sale_Price) : 
  object 'CONTRACTDATE' not found

如何做到这一点?

【问题讨论】:

  • 错误不会比object 'CONTRACTDATE' not found更清楚

标签: json r plyr rbind


【解决方案1】:

假设您有以下 JSON 文件:

txt <- '{"total_rows":141,"offset":0,"rows":[
  {"id":"1","key":"a","value":{"SP$Sale_Price":"240000","CONTRACTDATE$Contract_Date":"2006-10-26T05:00:00"}},
  {"id":"2","key":"b","value":{"SP$Sale_Price":"2000000","CONTRACTDATE$Contract_Date":"2006-08-22T05:00:00"}},
  {"id":"3","key":"c","value":{"SP$Sale_Price":"780000","CONTRACTDATE$Contract_Date":"2007-01-18T06:00:00"}}]}'

然后你可以用jsonlite包如下:

library(jsonlite)
json_data <- fromJSON(txt, flatten = TRUE)

# get the needed dataframe
dat <- json_data$rows
# set convenient names for the columns
# this step is optional, it just gives you nicer columnnames
names(dat) <- c("id","key","sale_price","contract_date")
# convert the 'contract_date' column to a datetime format
dat$contract_date <- strptime(dat$contract_date, format="%Y-%m-%dT%H:%M:%S", tz="GMT")

现在你可以绘图了:

plot(dat$contract_date, dat$sale_price)

这给出了:


如果您选择不展平 JSON,您可以这样做:

json_data <- fromJSON(txt)

dat <- json_data$rows$value

sp <- strtoi(dat$`SP$Sale_Price`)
cd <- strptime(dat$`CONTRACTDATE$Contract_Date`, format="%Y-%m-%dT%H:%M:%S", tz="GMT")
plot(cd,sp)

这给出了相同的情节:

【讨论】:

  • 太好了,谢谢!我有点失望,扁平化丢弃了字段名称。我的真实 json 数据中有 700 个属性。有什么办法可以保留属性名吗?
  • @AlexR 展平不会丢弃字段名。看json_data的结构。您将看到value. 添加在字段名称的前面。关于设置dat 名称的步骤不是必需的,因此是可选的。查看更新。
【解决方案2】:

我找到了一种不丢弃字段名称的方法:

install.packages("jsonlite")
install.packages("curl")
json <- fromJSON(json_file)
r <- json$rows

此时r 看起来像这样:

> class(r)
[1] "data.frame"
> colnames(r)
[1] "id"    "key"   "value"

经过更多的谷歌搜索和反复试验,我找到了这个:

f <- r$value
sp <- strtoi(f[["SP$Sale_Price"]])
cd <- strptime(f[["CONTRACTDATE$Contract_Date"]], format="%Y-%m-%dT%H:%M:%S", tz="GMT")
plot(cd,sp)

我的完整数据集的结果...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2021-09-18
    相关资源
    最近更新 更多