¿Cómo leemos un json desde R?

 Cargué el siguiente json {"playes":["V. Corral","Montserrat Saldívar","K. Palacios","B. Ceren","A. Chavarin"]} pero cuando lo leo con data <- jsonlite::read_json("test.json") no obtengo lo que espero. Me gustaría que data$players  fuera el vector c("V. Corral","Montserrat Saldívar","K. Palacios","B. Ceren","A. Chavarin") pero me da otra cosa: lista de listas anidadas. Cada elemento es una lista de un solo elemento

¿cómo le puedo hacer para  tener el vector que quiero?

Para obtener el vector que quieres, necesitas convertir la lista de un solo elemento que devuelve jsonlite::read_json() en un vector de caracteres.

El comportamiento que estás viendo es el esperado para jsonlite::read_json(). Esta función lee los datos JSON y los almacena en una lista de listas anidadas, manteniendo la estructura del JSON. Por eso, data$players no es un vector de caracteres directamente, sino una lista donde cada elemento es una lista de un solo elemento (un vector de longitud 1).

Para obtener el vector que deseas, puedes usar la función unlist().

La solución: Usar unlist()

unlist() toma una lista y combina todos sus elementos en un solo vector.

Aquí está cómo puedes modificar tu código:

R
# Suponiendo que 'data' ya tiene el resultado de read_json()
data <- jsonlite::read_json("test.json")

# Usar unlist() para convertir la lista de jugadores en un vector
jugadores_vector <- unlist(data$playes)

# Ahora 'jugadores_vector' es lo que esperas
print(jugadores_vector)

Salida:

[1] "V. Corral"         "Montserrat Saldívar" "K. Palacios"       "B. Ceren"          "A. Chavarin"

¿Por qué read_json() se comporta así?

La función read_json() está diseñada para ser un lector de JSON de "bajo nivel" y flexible, que mantiene la estructura anidada de los datos. Esto es útil cuando trabajas con JSONs complejos que tienen múltiples niveles de anidamiento.

Por otro lado, jsonlite::fromJSON() es una función de más "alto nivel" que intenta simplificar la estructura y convertirla directamente en un data.frame o vector siempre que sea posible. Si usas fromJSON() en tu archivo, obtendrías el vector directamente:

R
# Usando fromJSON(), que simplifica la estructura automáticamente
data_fromjson <- jsonlite::fromJSON("test.json")

# data_fromjson$playes ya es el vector que quieres
print(data_fromjson$playes)

Salida:

[1] "V. Corral"         "Montserrat Saldívar" "K. Palacios"       "B. Ceren"          "A. Chavarin" 

Para tu caso específico de un JSON simple, jsonlite::fromJSON() es probablemente la mejor herramienta, ya que te da el resultado directamente. Sin embargo, si necesitas usar read_json() por alguna razón, unlist() es la solución perfecta para aplanar esa lista y obtener un vector. 

Comentarios

Entradas más populares de este blog

¿Cómo comparar nombres de equipos de distintas fuentes?

¿Cómo hacemos filtrado y extracción de listas anidadas utilizando `purrr`?