Importieren von Daten aus einer JSON-Datei in R.


166

Gibt es eine Möglichkeit, Daten aus einer JSON-Datei in R zu importieren? Insbesondere ist die Datei ein Array von JSON-Objekten mit Zeichenfolgenfeldern, Objekten und Arrays. Das RJSON-Paket ist nicht sehr klar, wie mit diesem http://cran.r-project.org/web/packages/rjson/rjson.pdf umzugehen ist .


3
Duplizieren: stackoverflow.com/questions/2061897/parse-json-with-r . Wenn Sie ein bestimmtes Datenbeispiel haben, würde dies helfen. Andernfalls kann rjson zusammen mit der Datenmanipulation (z. B. mit einer Apply-Funktion oder Plyr) das tun, was Sie benötigen.
Shane

Ebenfalls ähnlich zu dieser Frage: stackoverflow.com/questions/2260147/… .
Shane

Hallo Shane, habe versucht, RJSON zu verwenden. Ich interessiere mich hauptsächlich für die notwendige Datenmanipulation. Hier ist ein Beispiel für eine JSON-Datei, mit der ich arbeite. example.json: [{"Gewinner": "68694999", "Stimmen": [{"ts": "Do 25. März 03:13:01 UTC 2010", "Benutzer": {"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}, ...]
user313967

1
Eine Warnung: Wenn die JSON-Datei wirklich groß ist, werden sie anscheinend von den .so- oder .dll-Bibliotheken nicht verarbeitet. Ein bevorzugtes Format ist NetCDF, aber einige Organisationen kennen dieses Problem nicht.

Antworten:


187

Installieren Sie zuerst das rjsonPaket:

install.packages("rjson")

Dann:

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

Update: seit Version 0.2.1

json_data <- fromJSON(file=json_file)

1
Beachten Sie, dass sich die Bearbeitung auf ein Update der Bibliothek bezieht, nicht auf R. Das Update ändert die letzte Zeile des vorherigen Beispiels und Sie müssen weiterhin wie oben in die Bibliothek laden.
Steven Waterman

90

jsonliteimportiert den JSON in einen Datenrahmen. Optional können verschachtelte Objekte reduziert werden. Verschachtelte Arrays sind Datenrahmen.

> 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

Absolut! Es ist wirklich einfacher, mit data.frames anstelle von Listen zu arbeiten, wenn Ergebnisse gefiltert werden!
MS Berends

31

Ein alternatives Paket ist RJSONIO. Um eine verschachtelte Liste zu konvertieren, kann lapply helfen:

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)

gibt Auskunft über die Stimmen in Ihrem Beispiel.


1
x$user$name, x$user$user_idsollte jetzt sein x$user['name'], x$user['user_id']. Dies m <- do.call(rbind, m)könnte auch eine bessere Möglichkeit sein, die Liste in eine Matrix zu konvertieren.
Jbaums

Gibt es so etwas wie die Funktion convertToDataFrame für JSON (wie für XML-Pakete)?
userJT

16

Wenn die URL https ist, wie sie für Amazon S3 verwendet wird, verwenden Sie getURL

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

11
PSA: getURL ist im RCurl-Paket.
Mark McDonald

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

3

Installieren Sie zuerst das RJSONIO- und RCurl-Paket:

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

Versuchen Sie den folgenden Code mit RJSONIO in der Konsole

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

Pakete:

  • Bibliothek (httr)
  • Bibliothek (jsonlite)

Ich hatte Probleme beim Konvertieren von JSON in Dataframe / CSV. Für meinen Fall habe ich:

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)

dann von df nach csv.

In diesem Format sollte es einfach sein, es bei Bedarf in mehrere CSV-Dateien zu konvertieren.

Der wichtige Teil ist die Inhaltsfunktion, die haben sollte type = 'text'.


1

httr-Paket importieren

library(httr)

Holen Sie sich die URL

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

Drucken Sie den Inhalt bzw. den Text aus

content(resp, as = "text")

Druckinhalt von resp

content(resp)

Verwenden Sie content (), um den Inhalt von resp abzurufen, geben Sie diesmal jedoch kein zweites Argument an. R stellt automatisch fest, dass es sich um einen JSON handelt, und konvertiert den JSON in eine benannte R-Liste.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.