Importazione di dati da un file JSON in R


166

C'è un modo per importare i dati da un file JSON in R? Più specificamente, il file è una matrice di oggetti JSON con campi stringa, oggetti e matrici. Il pacchetto RJSON non è molto chiaro su come gestire questo http://cran.r-project.org/web/packages/rjson/rjson.pdf .


3
Duplicato: stackoverflow.com/questions/2061897/parse-json-with-r . Se hai un esempio di dati specifico, ciò sarebbe di aiuto. Altrimenti rjson può fare ciò di cui hai bisogno, insieme alla manipolazione dei dati (ad es. Con una funzione apply o plyr).
Shane,

Anche simile a questa domanda: stackoverflow.com/questions/2260147/… .
Shane,

Ciao Shane, ho provato a usare RJSON. Sono interessato principalmente alla manipolazione dei dati necessaria. Ecco un esempio di un file JSON con cui sto lavorando. example.json: [{"winner": "68694999", "voti": [{"ts": "Gio 25 mar 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Gio 25 mar 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967

1
Un avvertimento: se il file JSON è veramente grande, apparentemente le librerie .so o .dll non lo elaboreranno. Un formato preferibile è NetCDF, ma alcune organizzazioni non sono a conoscenza di questo problema.

Risposte:


187

Innanzitutto installa il rjsonpacchetto:

install.packages("rjson")

Poi:

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=""))

Aggiornamento: dalla versione 0.2.1

json_data <- fromJSON(file=json_file)

1
Si noti che la modifica si riferisce a un aggiornamento della libreria, non a R. L'aggiornamento modifica l'ultima riga dell'esempio precedente e è comunque necessario caricare la libreria come sopra.
Steven Waterman,

90

jsonliteimporterà JSON in un frame di dati. Può opzionalmente appiattire oggetti nidificati. Le matrici nidificate saranno frame di dati.

> 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

Assolutamente! Lavorare con data.frames invece che con le liste è molto più semplice quando si filtrano i risultati!
MS Berends,

31

Un pacchetto alternativo è RJSONIO. Per convertire un elenco nidificato, lapply può aiutare:

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)

fornisce informazioni sui voti nel tuo esempio.


1
x$user$name, x$user$user_idora dovrebbe essere x$user['name'], x$user['user_id']. Inoltre, m <- do.call(rbind, m)potrebbe essere un modo migliore per convertire l'elenco in una matrice.
jbaums,

esiste qualcosa come la funzione convertToDataFrame per JSON (come nel caso del pacchetto XML)?
userJT

16

Se l'URL è https, come utilizzato per Amazon S3, utilizzare getURL

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

11
PSA: getURL è nel pacakge RCurl.
Mark McDonald

1
Inoltre,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja il

3

Innanzitutto installa il pacchetto RJSONIO e RCurl:

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

Prova sotto il codice usando RJSONIO nella 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)


2

pacchi:

  • biblioteca (HTTR)
  • biblioteca (jsonlite)

Ho avuto problemi con la conversione di json in dataframe / csv. Per il mio caso ho fatto:

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)

quindi da df a csv.

In questo formato dovrebbe essere facile convertirlo in più .csvs se necessario.

La parte importante è la funzione di contenuto dovrebbe avere type = 'text'.


1

import httr package

library(httr)

Ottieni l'URL

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

Stampa il contenuto di resp come testo

content(resp, as = "text")

Stampa il contenuto di resp

content(resp)

Usa content () per ottenere il contenuto di resp, ma questa volta non specifica un secondo argomento. R scopre automaticamente che hai a che fare con un JSON e converte il JSON in un elenco R denominato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.