Importar datos de un archivo JSON a R


166

¿Hay alguna manera de importar datos de un archivo JSON a R? Más específicamente, el archivo es una matriz de objetos JSON con campos de cadena, objetos y matrices. El paquete RJSON no es muy claro sobre cómo lidiar con este http://cran.r-project.org/web/packages/rjson/rjson.pdf .


3
Duplicado: stackoverflow.com/questions/2061897/parse-json-with-r . Si tiene un ejemplo de datos específico, eso ayudaría. De lo contrario, rjson puede hacer lo que necesita, junto con la manipulación de datos (por ejemplo, con una función de aplicación o plyr).
Shane

También similar a esta pregunta: stackoverflow.com/questions/2260147/… .
Shane

Hola Shane, intenté usar RJSON. Estoy interesado principalmente en la manipulación de datos necesaria. Aquí hay un ejemplo de un archivo JSON con el que estoy trabajando. example.json: [{"ganador": "68694999", "votos": [{"ts": "jue 25 de marzo 03:13:01 UTC 2010", "usuario": {"nombre": "Lamur", "user_id": "68694999"}}, {"ts": "jue 25 mar 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"marca de tiempo": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967

1
Una advertencia: si el archivo JSON es realmente grande, aparentemente las bibliotecas .so o .dll no lo procesarán. Un formato preferible es NetCDF, pero algunas organizaciones no son conscientes de este problema.

Respuestas:


187

Primero instale el rjsonpaquete:

install.packages("rjson")

Luego:

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

Actualización: desde la versión 0.2.1

json_data <- fromJSON(file=json_file)

1
Tenga en cuenta que la edición se refiere a una actualización de la biblioteca, no a R. La actualización cambia la última línea del ejemplo anterior y aún necesita cargar en la biblioteca como se indicó anteriormente.
Steven Waterman

90

jsonliteimportará el JSON en un marco de datos. Opcionalmente, puede aplanar objetos anidados. Las matrices anidadas serán marcos de datos.

> 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

¡Absolutamente! ¡Es realmente más fácil trabajar con data.frames en lugar de listas cuando se filtran resultados!
MS Berends

31

Un paquete alternativo es RJSONIO. Para convertir una lista anidada, lapply puede ayudar:

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)

da información sobre los votos en su ejemplo.


1
x$user$name, x$user$user_idahora debería ser x$user['name'], x$user['user_id']. Además, m <- do.call(rbind, m)podría ser una mejor manera de convertir la lista a una matriz.
jbaums

¿Hay algo así como la función convertToDataFrame para JSON (como hay para el paquete XML)?
userJT

16

Si la URL es https, como se usa para Amazon S3, use getURL

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

11
PSA: getURL está en el paquete RCurl.
Mark McDonald

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

3

Primero instale el paquete RJSONIO y RCurl:

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

Pruebe el siguiente código con RJSONIO en la consola

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

paquetes:

  • biblioteca (httr)
  • biblioteca (jsonlite)

He tenido problemas para convertir json a dataframe / csv. Para mi caso hice:

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)

luego de df a csv.

En este formato, debería ser fácil convertirlo a múltiples .csvs si es necesario.

La parte importante es la función de contenido debe tener type = 'text'.


1

paquete de importación httr

library(httr)

Obtén la url

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

Imprimir contenido de resp como texto

content(resp, as = "text")

Imprimir contenido de resp

content(resp)

Use content () para obtener el contenido de resp, pero esta vez no especifique un segundo argumento. R se da cuenta automáticamente de que se trata de un JSON y convierte el JSON en una lista de R con nombre.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.