Json 国际货币基金组织数据下载错误
我正面临着臭虫,这让我非常紧张。 所以,从头开始:我编写了一个代码,从IMF DOT(国家出口和进口数据)下载数据。 有时这段代码可以工作(下载所有数据)。在某时另一次,在下载过程中,我发现错误:Json 国际货币基金组织数据下载错误,json,r,utf-8,Json,R,Utf 8,我正面临着臭虫,这让我非常紧张。 所以,从头开始:我编写了一个代码,从IMF DOT(国家出口和进口数据)下载数据。 有时这段代码可以工作(下载所有数据)。在某时另一次,在下载过程中,我发现错误: No encoding supplied: defaulting to UTF-8. Error: lexical error: invalid char in json text. <!DOCTYPE HTML PU
No encoding supplied: defaulting to UTF-8.
Error: lexical error: invalid char in json text.
<!DOCTYPE HTML PUBLIC "-//W3C//
(right here) ------^
未提供编码:默认为UTF-8。
错误:词法错误:json文本中的字符无效。
Code:
rm(list = ls())
#Code downloads data from DOT (IMF).
#DOT(date).csv
# Libraries
suppressPackageStartupMessages(library(plyr))
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(tidyr))
suppressPackageStartupMessages(library(reshape2))
suppressPackageStartupMessages(library(stringr))
suppressPackageStartupMessages(library(IMFData))
suppressPackageStartupMessages(library(TTR))
suppressPackageStartupMessages(library(readxl))
#Parameters of download -------------------------------------------------------
databaseID <- 'DOT'
startdate <- '1977-01-01'
enddate <- format(Sys.Date(),"%Y-%m-%d")
checkquery = FALSE
# Frequency
download.freq <- c("A")
# Area
available.codes <- DataStructureMethod('DOT')
cn <- available.codes$CL_AREA_DOT
# Download data -----------------------------------------------------------
print("Downloading")
datalist <- list(); queryfilter<- list()
for(i in 1:length(cn[,"CodeValue"])) queryfilter[[i]] <- list(CL_FREA=download.freq, CL_AREA_DOT=cn[,"CodeValue"][i], CL_INDICATOR_DOT = "TXG_FOB_USD"
)
datalist<- plyr::llply(queryfilter, function(x) {
Sys.sleep(runif(1,2,5))
Dot.downloader(databaseID,x, startdate, enddate)
}, .progress = "text")
#WHERE ERRORS HAPPENS
data <- do.call(rbind.data.frame, datalist) #..............................................................................................................................................................................................................................................
Dot.downloader <- function(databaseID, queryfilter=NULL,
startdate='1977-01-01', enddate='2016-12-31'){
queryfilterstr <- ''
if (length(queryfilter) > 0){
queryfilterstr <- paste0(
unlist(plyr::llply(queryfilter,
function(x)(paste0(x, collapse="+")))), collapse=".")
}
APIstr <- paste0('http://dataservices.imf.org/REST/SDMX_JSON.svc/CompactData/',
databaseID,'/',queryfilterstr,
'?startPeriod=',startdate,'&endPeriod=',enddate)
r <- httr::GET(APIstr)
if(httr::http_status(r)$reason != "OK"){
stop(paste(unlist(httr::http_status(r))))
return(list())
}
r.parsed <- jsonlite::fromJSON(httr::content(r, "text"))
if(is.null(r.parsed$CompactData$DataSet$Series)){
warning("No data available")
return(NULL)
}
if(class(r.parsed$CompactData$DataSet$Series) == "data.frame"){
r.parsed$CompactData$DataSet$Series <- r.parsed$CompactData$DataSet$Series[!plyr::laply(r.parsed$CompactData$DataSet$Series$Obs, is.null),]
if(nrow(r.parsed$CompactData$DataSet$Series) ==0){
warning("No data available")
return(NULL)
}
}
if(class(r.parsed$CompactData$DataSet$Series) == "list"){
if(is.null(r.parsed$CompactData$DataSet$Series$Obs)){
warning("No data available")
return(NULL)
}
ret.df <- as.data.frame(r.parsed$CompactData$DataSet$Series[1:(length(r.parsed$CompactData$DataSet$Series)-1)])
ret.df$Obs <- list(r.parsed$CompactData$DataSet$Series$Obs)
names(ret.df) <- names(r.parsed$CompactData$DataSet$Series)
r.parsed$CompactData$DataSet$Series <- ret.df
}
return(r.parsed$CompactData$DataSet$Series)
}