2014-11-01 6 views
2

데이터 요청 API를 사용하기 위해 R에 다음 코드를 작성했습니다. 그것은 일반적인 웹 서비스 JSON API입니다. R URL의 JSON 형식의 데이터를 덜 자세하게 data.frame으로 가져 오도록 JSON 형식의 요청을 게시하려면 어떻게해야합니까?

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 다음 fromJSON를 통해 R 구조에 결과 JSON 데이터를 변환하는 URL에 대한 GET reuest를 초기화. 나는 그것을 원한 같은

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

사실 내 코드는 data.frame에 데이터를 얻을 수 있지만, 그것은 고통스럽게 자세한 내가이 라인을 모두 달성하기 위해 필요했다고 생각하지 않습니다 다음 JSON 요청은 다음과 같습니다 원하는 결과. 원하는 결과는 물론 mydf data.frame입니다.

질문 : 웹 서비스에서 data.frame으로 데이터를 가져 오는 가장 짧고 정확한 방법은 무엇입니까?

건배, 마이클

+0

json으로 보인다. 올바른 JSON이라면'content (r, "text")'와 함께 쉽게 파싱 할 것이고, 그러면'jsonlite :: fromJSON()'이 가능하면'data.frame'을 파싱 할 것입니다. – sckott

답변

6

두 가지 문제가 있습니다. 하나는 jsonlite를 사용하지 않는 것입니다 :-) 다른 하나는 JSON 소스가 blob에 접두어로 붙어있는 것으로 U+FEFFByte order Mark 문자로 JSON이 유효하지 않게되는 것입니다. RFC7159 메시지 :

구현시 JSON 텍스트의 시작 부분에 바이트 순서 표시를 추가하면 안됩니다. 상호 운용성을 위해 JSON 텍스트를 구문 분석하는 구현에서는 오류로 간주하지 않고 바이트 순서 표시를 무시할 수 있습니다 (MAY).

그래서 scb.se는 JSON을 올바르게 형식화하지 않습니다. 어느 쪽이든,이 시도 :이 예는,`jsonlite :: 유효성 검사 (내용 (r은 "텍스트"))`에서 오류가 발생, 제대로 포맷되지 않은 것처럼

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) 
+0

실제로 당신 말이 맞습니다. . 태초에 숨어있는 빨판이있었습니다. 이상한 큰 데이터 제공 업체를 위해 이상한 점이 있습니다. –

+2

FYI jsonlite의 새 버전에는 BOM을 무시하는 수정 프로그램이 있습니다. – Jeroen