Aeson: продолжаем

Приветствую, друзья!

Итак, продолжим рассмотрение пакета aeson, предназначенного, как вы помните, для работы с JSON.

Работа с Haskell-типами

В предыдущей заметке мы работали с JSON посредством собственного типа Host. Это весьма удобно, но в ряде случаев вводить собственный тип не обязательно.

Пусть в нашем JSON будет обычный массив:

В этом случае мы легко обойдёмся списком строк:

Вполне ожидаемый результат:

Или пусть у нас есть три простые координаты:

Читаем их в обыкновенный словарь:

Вывод:

Таким образом, мы убедились, что для простых случаев вводить собственные типы вообще не нужно. Ну а что касается обратного превращения в JSON, тут уж совсем всё просто:

Только не забываем явно указывать тип значения coords, а то компилятору трудно будет разобраться. В итоге:

Вытаскиваем значение отдельного поля

Представим, что есть вот такой JSON с краткой информацией обо мне:

И вот понадобилось мне извлечь значение конкретного поля. Одного-единственного поля, мне не нужно всё остальное. Скажем, URL репозитория моего блога. Таким образом, нам необходимо заглянуть вглубь: / -> social -> GitHub -> blog. Вот как это выглядит:

Обратите внимание, что тип значения result соответствует Maybe Object. Затем, после извлечения конкретного значения из Maybe, мы передаём его функции getBlogRepoURL. Вот её определение:

Самое интересное происходит в функции extractBlogRepoURL, ведь именно здесь мы погружаемся в наш JSON. Для этого используется три лямбда-функции, в каждой из которых мы видим уже знакомый нам оператор извлечения значения .:. А для того, чтобы сделать их более понятными, я привожу их в полной форме (в сокращённой будет чуть ниже). Но как же происходит погружение в JSON-структуру? Чтобы всё встало на свои места, привожу JSON в “разобранном” виде:

Вот теперь назначение лямбда-функций предельно понятно. Первая функция:

погружает нас в 1-й подобъект, вторая функция:

ведёт нас в 2-й подобъект, ну а третья:

уже извлекает значение URL репозитория блога.

Кстати, как и было обещано, привожу упрощённую форму функции extractBlogRepoURL:

Мы убрали лямбда-уточнения и сильно сократили код. Кому-то подобное сокращение не понравится, но пусть каждый сам выбирает удобную для него форму.

Ну вот, на сегодня хватит.