Парсим сложные JSON и XML структуры без циклов.

xml and json parsing

При работе с API различных систем данные в ответе имеют форматы JSON или XML со сложной вложенной древовидной структурой. Распарсить такие данные та ещё задача. Часто программисты прибегают к преобразованию массива данных в список и в цикле разбирают элементы этого списка.

Всё можно сделать гораздо проще и без циклов с помощью пакета tidyr. Он входит в состав других пакетов, поэтому чаще всего отдельно его устанавливать и подключать нет необходимости.

Первым делом нужно преобразовать JSON или XML список во фрейм
‘название фрейма’ <- tibble( имя столбца = имя JSON-документа )
пример:

frame_d <- tibble( data = xml_list )

Теперь каждый элемент списка мы можем преобразовать в столбец:

frame_d %>% unnest_wider(data)

Если колонок слишком много и нужны только конкретные, можем использовать другую функцию пакета:

frame_d  %>% hoist(data, 
                   name_clmn1 = "name_clmn1", 
                   name_clmn2 = "name_clmn2", 
                   name_clmn3 = "name_clmn3" 
                   )

Если имеем много уровневые вложение, то пишем так:
для примера элемент ‘user_access’ у нас имеет два параметра: ‘login’ и ‘password’

frame_d %>% hoist(data, 
                  login = c("user_access", "login"), 
                  pass = c("user_access", "password"),
                  clmn3 = "clmn3",
                  clmn4 = "clmn4"
                  )

При сложной структуре исходного документа может потребоваться преобразовать элементы списка не в столбцы, а в строки:

frame_d <- frame_d %>% unnest_longer(data)

Применяя комбинацию этих функций к разным элементам JSON или XML списков, можно относительно просто их распарсить, не прибегая к циклам.

Функция unnest_auto() может автоматически подобрать алгоритм парсинга, но её лучше использовать для разовых задач на стабильных данных. Если в исходных данных что-то изменится, функция может поменять алгоритм парсинга, и на выходе вы получите данные другой структуры.

Статья подготовлена по материалам Интернета

(Visited 38 times, 1 visits today)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *