Importer des données d'un fichier JSON dans R

166

Existe-t-il un moyen d'importer des données d'un fichier JSON dans R? Plus spécifiquement, le fichier est un tableau d'objets JSON avec des champs de chaîne, des objets et des tableaux. Le package RJSON n'est pas très clair sur la façon de gérer ce http://cran.r-project.org/web/packages/rjson/rjson.pdf .

user313967
la source
3
Dupliquer: stackoverflow.com/questions/2061897/parse-json-with-r . Si vous avez un exemple de données spécifique, cela vous aiderait. Sinon, rjson peut faire ce dont vous avez besoin, ainsi que la manipulation des données (par exemple avec une fonction apply ou plyr).
Shane
Également similaire à cette question: stackoverflow.com/questions/2260147/… .
Shane
Salut Shane, j'ai essayé d'utiliser RJSON. Je m'intéresse principalement à la manipulation des données nécessaire. Voici un exemple de fichier JSON avec lequel je travaille. example.json: [{"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, "utilisateur": { "name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967
1
Attention: si le fichier JSON est vraiment volumineux, apparemment les bibliothèques .so ou .dll ne le traiteront pas. Un format préférable est NetCDF, mais certaines organisations ne sont pas conscientes de ce problème.

Réponses:

187

Installez d'abord le rjsonpackage:

install.packages("rjson")

Ensuite:

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

Mise à jour: depuis la version 0.2.1

json_data <- fromJSON(file=json_file)
rcs
la source
1
Notez que la modification fait référence à une mise à jour de la bibliothèque, pas à R. La mise à jour modifie la dernière ligne de l'exemple précédent et vous devez toujours charger dans la bibliothèque comme ci-dessus.
Steven Waterman
90

jsonliteimportera le JSON dans un bloc de données. Il peut éventuellement aplatir les objets imbriqués. Les tableaux imbriqués seront des trames de données.

> 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.
la source
Absolument! Vraiment plus facile de travailler avec data.frames au lieu de listes lors du filtrage des résultats!
MS Berends
31

Un autre package est RJSONIO. Pour convertir une liste imbriquée, lapply peut vous aider:

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)

donne des informations sur les votes dans votre exemple.

Karsten W.
la source
1
x$user$name, x$user$user_iddevrait être maintenant x$user['name'], x$user['user_id']. Cela m <- do.call(rbind, m)pourrait également être une meilleure façon de convertir la liste en matrice.
jbaums
y a-t-il quelque chose comme la fonction convertToDataFrame pour JSON (comme il y en a pour le package XML)?
userJT
16

Si l'URL est https, comme celle utilisée pour Amazon S3, utilisez getURL

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))
Anthony
la source
11
PSA: getURL est dans le pacakge RCurl.
Mark McDonald
1
Aussi,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja
3

Installez d'abord le package RJSONIO et RCurl:

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

Essayez le code ci-dessous en utilisant RJSONIO dans la 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
la source
2

paquets:

  • bibliothèque (httr)
  • bibliothèque (jsonlite)

J'ai eu des problèmes pour convertir json en dataframe / csv. Pour mon cas, j'ai fait:

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)

puis de df à csv.

Dans ce format, il devrait être facile de le convertir en plusieurs fichiers .csvs si nécessaire.

La partie importante est que la fonction de contenu devrait avoir type = 'text'.

Aaron C
la source
1

importer un package httr

library(httr)

Obtenez l'url

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

Imprimer le contenu de resp sous forme de texte

content(resp, as = "text")

Imprimer le contenu de resp

content(resp)

Utilisez content () pour obtenir le contenu de resp, mais cette fois ne spécifiez pas de second argument. R comprend automatiquement que vous avez affaire à un JSON et convertit le JSON en une liste R nommée.

Adarsh ​​Pawar
la source