Проблемы с синтаксическим анализом JSON «None» с помощью jsonlite

#r #json #tidyverse #jsonlite

#r #json #tidyverse #jsonlite

Вопрос:

Я пытаюсь прочитать некоторые данные из британской информационной панели covid о данных вакцинации, которые кодируют некоторые данные в формате JSON в файле csv. (Ссылка для скачивания здесь) из данных о вакцинации, по дате вакцинации, возрасту, демографическим данным на странице (https://coronavirus.data.gov.uk/details/vaccinations?areaType=nationamp;areaName=England ). Проблема заключается в том, что мой код больше не успешно расширяет данные JSON в data.frame. Похоже, это проблема с синтаксическим анализом, когда данные попадают в объект None.

Мой код считывает данные следующим образом (этот код был успешным для данных, загруженных в 2021-11-25, но не удался с данными 2021-12-02). Приведенный ниже код завершается ошибкой при выполнении команды FromJSON, которая теперь выдает ошибку при достижении «аргумента»: None, указывающего на лексическую ошибку. Сообщение об ошибке показано под кодом.

 library(tidyverse)
library(jsonlite)

#! Read in the latest national dashboard data
df <- read_csv("<filepath>")

df |> 
  mutate(vaccinationsAgeDemographics = map(vaccinationsAgeDemographics, ~fromJSON(. |> str_replace_all("'", """)))) |> 
  unnest(cols = c(vaccinationsAgeDemographics))
 
 Error: Problem with `mutate()` column `vaccinationsAgeDemographics`.
i `vaccinationsAgeDemographics = map(...)`.
x lexical error: invalid char in json text.
          yVaccinationDatePercentage": None}, {"age": "16_17", "Vaccin
                     (right here) ------^
 

Упрощенная тестовая строка будет выглядеть следующим образом:

 fromJSON(df$vaccinationsAgeDemographics[1] |> str_replace_all("'", """))
 

что вызывает аналогичную ошибку:

 Error: lexical error: invalid char in json text.
          yVaccinationDatePercentage": None}, {"age": "16_17", "Vaccin
                     (right here) ------^
 

Комментарии:

1. В качестве быстрого исправления я только что заменил эти значения в строке на то, что может обрабатывать jsonlite, но сейчас это кажется неоптимальным

Ответ №1:

Мне удалось решить эту проблему, поскольку возможные сопоставления json обсуждаются в документах jsonlite здесь: https://cran.r-project.org/web/packages/jsonlite/vignettes/json-mapping.pdf

Зная заранее, что данные предназначены для числового типа и что None не содержится ни в одном из имен индикаторов, мы можем заменить None строку на an "NA" , используя следующий код:

 library(tidyverse)
library(jsonlite)

df <- read_csv("C:\Users\joel.kandiah\Downloads\data_2021-Dec-02.csv")

fromJSON(df$vaccinationsAgeDemographics[1] |> str_replace_all("'", """) |> str_replace_all("None", ""NA""))