Importando dados de um arquivo JSON para o R

166

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

user313967
fonte
3
Duplicar: stackoverflow.com/questions/2061897/parse-json-with-r . Se você tiver um exemplo de dados específico, isso ajudaria. Caso contrário, o rjson pode fazer o que você precisa, juntamente com a manipulação de dados (por exemplo, com uma função apply ou plyr).
21710 Shane
Também semelhante a esta pergunta: stackoverflow.com/questions/2260147/… .
21710 Shane
Oi Shane, tentei usar o RJSON. Estou interessado principalmente na manipulação de dados necessária. Aqui está um exemplo de um arquivo JSON com o qual estou trabalhando. example.json: [{"winner": "68694999", "votes": [{"ts": "Qui 25 de março 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Qui 25 de março 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
usuário313967
1
Cuidado: se o arquivo JSON for realmente grande, aparentemente as bibliotecas .so ou .dll não o processarão. Um formato preferível é o NetCDF, mas algumas organizações não estão cientes desse problema.

Respostas:

187

Primeiro instale o rjsonpacote:

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)
rcs
fonte
1
Observe que a edição está se referindo a uma atualização da biblioteca, não a R. A atualização altera a última linha do exemplo anterior e você ainda precisa carregar a biblioteca como acima.
Steven Waterman
90

jsonliteimportará o JSON para um quadro de dados. Opcionalmente, pode achatar objetos aninhados. Matrizes aninhadas serão quadros 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
xn.
fonte
Absolutamente! Realmente mais fácil trabalhar com data.frames em vez de listas ao filtrar resultados!
MS Berends
31

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)

fornece informações sobre os votos no seu exemplo.

Karsten W.
fonte
1
x$user$name, x$user$user_idagora deve ser x$user['name'], x$user['user_id']. Além disso, m <- do.call(rbind, m)pode ser uma maneira melhor de converter a lista em uma matriz.
jbaums
existe algo como a função convertToDataFrame para JSON (como existe no pacote XML)?
usar o seguinte comando
16

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

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))
Anthony
fonte
11
PSA: getURL está no pacote RCurl.
Mark McDonald
1
Além disso,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja
3

Primeiro instale o pacote RJSONIO e RCurl:

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

Experimente o código abaixo usando o RJSONIO no console

library(RJSONIO)
library(RCurl)
json_file = getURL("https://raw.githubusercontent.com/isrini/SI_IS607/master/books.json")
json_file2 = RJSONIO::fromJSON(json_file)
head(json_file2)

Moby M
fonte
2

pacotes:

  • biblioteca (httr)
  • biblioteca (jsonlite)

Eu tive problemas ao converter json para dataframe / csv. No meu caso, 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)

depois de df para csv.

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

A parte importante é que a função de conteúdo deve ter type = 'text'.

Aaron C
fonte
1

pacote httr de importação

library(httr)

Obter o URL

url <- "http://www.omdbapi.com/?apikey=72bc447a&t=Annie+Hall&y=&plot=short&r=json"
resp <- GET(url)

Imprimir conteúdo de resp como texto

content(resp, as = "text")

Imprimir conteúdo de resp

content(resp)

Use content () para obter o conteúdo de resp, mas desta vez não especifique um segundo argumento. R descobre automaticamente que você está lidando com um JSON e converte o JSON em uma lista R nomeada.

Adarsh ​​Pawar
fonte