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.