簡體   English   中英

如何以較簡潔的方式將JSON格式的請求從R中的URL中的GET JSON數據發布到data.frame中?

[英]How do I POST a JSON formatted request to GET JSON data from a URL in R into the data.frame in a less verbose manner?

我在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的get reuest,然后通過fromJSON將生成的JSON數據轉換為R結構。 JSON請求如下所示:

{ "query": [], "response": { "format": "json" } }

事實上,我的代碼將數據輸入到我想要的數據框架中,但是它非常冗長,我拒絕相信所有這些線條都是實現所需結果所必需的。 想要的結果當然是mydf data.frame。

所以我的問題是:從Web服務獲取數據到data.frame的最短和最正確的方法是什么?

干杯,邁克爾

有兩個問題。 一個是你沒有使用jsonlite :-)另一個是你的JSON源似乎在blob前面加上一個U+FEFF 字節順序Mark字符使得JSON無效。 RFC7159說:

實現絕不能在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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM