Importando dados de um arquivo JSON para o R

Existe uma maneira de importar dados de um arquivo JSON para o R? Mais especificamente, o arquivo é uma matriz de objects JSON com campos de string, objects e matrizes. O pacote RJSON não é muito claro sobre como lidar com este http://cran.r-project.org/web/packages/rjson/rjson.pdf .

Primeiro instale o pacote rjson :

 install.packages("rjson") 

Então:

 library("rjson") json_file < - "http://api.worldbank.org/country?per_page=10&region=OED&lendingtype=LNX&format=json" json_data <- fromJSON(paste(readLines(json_file), collapse="")) 

Atualização: desde a versão 0.2.1

 json_data < - fromJSON(file=json_file) 

jsonlite importará o JSON para um quadro de dados. Pode opcionalmente achatar objects nesteds. Matrizes aninhadas serão frameworks de dados.

 > library(jsonlite) > winners < - fromJSON("winners.json", flatten=TRUE) > colnames(winners) [1] "winner" "votes" "startPrice" "lastVote.timestamp" "lastVote.user.name" "lastVote.user.user_id" > winners[,c("winner","startPrice","lastVote.user.name")] winner startPrice lastVote.user.name 1 68694999 0 Lamur > winners[,c("votes")] [[1]] ts user.name user.user_id 1 Thu Mar 25 03:13:01 UTC 2010 Lamur 68694999 2 Thu Mar 25 03:13:08 UTC 2010 Lamur 68694999 

Um pacote alternativo é o RJSONIO. Para converter uma lista aninhada, o lapply pode ajudar:

 l < - fromJSON('[{"winner":"68694999", "votes":[ {"ts":"Thu Mar 25 03:13:01 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}, {"ts":"Thu Mar 25 03:13:08 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}], "lastVote":{"timestamp":1269486788526,"user": {"name":"Lamur","user_id":"68694999"}},"startPrice":0}]' ) m <- lapply( l[[1]]$votes, function(x) c(x$user['name'], x$user['user_id'], x['ts']) ) m <- do.call(rbind, m) 

dá informações sobre os votos em seu exemplo.

Se o URL for https, como o usado no Amazon S3, use getURL

 json < - fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json')) 

Primeiro instale o pacote RJSONIO e RCurl:

 install.packages("RJSONIO") install.packages("(RCurl") 

pacotes:

  • biblioteca (httr)
  • biblioteca (jsonlite)

Eu tive problemas ao converter json para dataframe / csv. Para o meu caso eu fiz:

 Token < - "245432532532" source <- "http://......." header_type <- "applcation/json" full_token <- paste0("Bearer ", Token) response <- GET(n_source, add_headers(Authorization = full_token, Accept = h_type), timeout(120), verbose()) text_json <- content(response, type = 'text', encoding = "UTF-8") jfile <- fromJSON(text_json) df <- as.data.frame(jfile) 

então de df para csv.

Nesse formato, deve ser fácil convertê-lo em vários .csvs, se necessário.

A parte importante é que a function content deve ter type = 'text' .

Para importar, eu tive que adicionar “marcas:

json_data < - fromJSON (file = "json_file")

Espero que ajude alguém.

Cormac