我已经在R中编写了以下代码以开始使用数据请求API。这是一个普通的Web服务JSON API。
library(RJSONIO) library(RCurl) library(httr) r <- POST("http://api.scb.se/OV0104/v1/doris/sv/ssd/START/PR/PR0101/PR0101A/KPIFastM2", body = '{ "query": [], "response": { "format": "json" } }') stop_for_status(r) a<-content(r, "text", "application/json", encoding="UTF-8") cat(a, file = "test.json") x<-fromJSON(file("test.json", "r")) mydf<-do.call(rbind, lapply(x$data, data.frame)) colnames(mydf)<-c("YearMonth", "CPI")
基本上,它使用httr初始化了URL的获取请求,然后通过fromJSON将生成的JSON数据转换为R结构。JSON请求如下所示:
{ "query": [], "response": { "format": "json" } }
确实,我的代码像我希望的那样将数据放入了data.frame中,但是它非常冗长,我拒绝相信所有这些行对于实现所需结果都是必需的。所需的结果是mydf data.frame。
因此,我的问题是:将数据从Web服务获取到data.frame的最短,最正确的方法是什么?
干杯,迈克尔
有两个问题。一种是您没有使用jsonlite :-)另一种是您的JSON源似乎为blob加上了使JSON无效的U+FEFF Byte order Mark字符。RFC7159说:
U+FEFF
实现不得在JSON文本的开头添加字节顺序标记。为了互操作性,解析JSON文本的实现可以忽略字节顺序标记的存在,而不是将其视为错误。
因此scb.se无法正确格式化其JSON。无论哪种方式,请尝试以下操作:
library(jsonlite) library(httr) req <- POST("http://api.scb.se/OV0104/v1/doris/sv/ssd/START/PR/PR0101/PR0101A/KPIFastM2", body = '{ "query": [], "response": { "format": "json" } }') stop_for_status(req) json <- content(req, "text") # JSON starts with an invalid character: validate(json) json <- substring(json, 2) validate(json) # Now we can parse object <- jsonlite::fromJSON(json) print(objects)