es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problemas al analizar JSON “None” con jsonlite

Estoy tratando de leer información del panel de control COVID del Reino Unido sobre datos de vacunación que codifica algunos de los datos como JSON dentro de un archivo CSV. (El enlace de descarga está aquí) desde la página de Datos de vacunación, por fecha de vacunación y demografía por edad (https://coronavirus.data.gov.uk/details/vaccinations?areaType=nation&areaName=England). El problema que surge es que mi código ya no puede convertir exitosamente los datos JSON en un data.frame. Esto parece ser un problema de análisis cuando los datos se encuentran con un objeto None.

Mi código lee los datos de la siguiente manera (este código tuvo éxito con los datos descargados el 2021-11-25, pero falló con los datos del 2021-12-02). El código a continuación falla en el comando fromJSON, que ahora genera un error al encontrar un “Arg”: None, alegando un error léxico. El mensaje de error se muestra debajo del código.

library(tidyverse)
library(jsonlite)

# ¡Leer los últimos datos del panel nacional!
df <- read_csv("<filepath>")

df %>%
  mutate(vaccinationsAgeDemographics = map(vaccinationsAgeDemographics, ~fromJSON(. |> str<em>replace</em>all("&#39;", "\\&quot;")))) %>%
  unnest(cols = c(vaccinationsAgeDemographics))
Error: Problema con la columna `vaccinationsAgeDemographics` de `mutate()`.
i `vaccinationsAgeDemographics = map(...)`.
x error léxico: carácter no válido en el texto JSON.
          yVaccinationDatePercentage&quot;: None}, {&quot;age&quot;: &quot;16_17&quot;, &quot;Vaccin
                     (justo aquí) ------^

Una línea de prueba simplificada sería la siguiente:

fromJSON(df$vaccinationsAgeDemographics[1] |&gt; str_replace_all("&#39;", "\\&quot;"))

que produce un error similar:

Error: error léxico: carácter no válido en el texto JSON.
          yVaccinationDatePercentage&quot;: None}, {&quot;age&quot;: &quot;16_17&quot;, &quot;Vaccin
                     (justo aquí) ------^

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código se debe al cambio en la estructura de datos en los datos de vacunación del panel de control de Covid del Reino Unido. Ahora, los datos incluyen un objeto ‘None’ en los datos JSON, lo cual provoca un error de análisis con el comando ‘fromJSON’. Una posible solución es reemplazar los objetos ‘None’ con un valor nulo, lo cual se puede hacer utilizando la función ‘str_replace_all’ del paquete ‘stringr’.

    library(tidyverse)
    library(jsonlite)
    library(stringr)
    
    #! Leer los últimos datos del panel de control nacional
    df <- read_csv("<ruta_archivo>")
    
    df %>%
      mutate(vaccinationsAgeDemographics = map(vaccinationsAgeDemographics, 
                                               ~fromJSON(.x %>% 
                                                           str_replace_all("None", "null")))) %>%
      unnest(cols = c(vaccinationsAgeDemographics))
    

    Este código utiliza la función ‘map’ para aplicar el comando ‘fromJSON’ a cada fila de la columna ‘vaccinationsAgeDemographics’, después de reemplazar cualquier objeto ‘None’ con un valor nulo utilizando ‘str_replace_all’. El marco de datos resultante ahora debería incluir los datos JSON expandidos sin errores de análisis.

    La línea de prueba simplificada también se puede modificar de la siguiente manera:

    fromJSON(str_replace_all(df$vaccinationsAgeDemographics[1], "None", "null"))
    

    Este código reemplaza cualquier objeto ‘None’ en la cadena JSON con valores nulos antes de utilizar el comando ‘fromJSON’.

Comments are closed.