Частичный разбор JSON-объектов с aeson в Haskell



Я делаю довольно простой веб-сервис CRUD в Haskell с варпом (и, возможно, Скотти) и кислотным состоянием.



В кислотном состоянии я храню записи пользователей в данных.Карта (согласноэтому примеру). Я знаю, что эти записи всегда будут полными при создании, поэтому мне не нужно квалифицироваться с большим количеством "может быть". Однако при обновлении пользователя клиент может выбрать отправку частичного объекта json с заполнением только некоторых полей.



Каким был бы идиоматический способ представляете это? Я должен был одним данным декларации, FullUser, без "может", а точно так же, с "Может быть" перед все дополнительные ключи, PartialUser, и пусть aeson автоматически получают кодирования и декодирования для последней, наконец, написать свою собственную функцию обновления типа :: FullUser -> PartialUser -> FullUser?



Это был бы не очень большой код, но он чувствует себя немного уродливым и как будто немного нарушает сухость. Это должно быть такой распространенной задачей в веб-сервере, так что, возможно, это уже было были решены обобщенно (возможно, с помощью TH)?



Я понимаю, что я мог бы просто хранить строку json и всегда проверять отсутствие ключей, что делает ее немного неуклюжей, но более надежной для будущих изменений схемы, но я все равно хотел бы знать, как я буду делать это "типобезопасным" способом.



Править:
Или, возможно, я должен иметь только FullUser и использовать aeson-lens, чтобы написать простую функцию обновления из FullUser и строки json?

690   1  

1 ответ:

Идиоматический Хаскелл делает как можно больше статических проверок. Вы всегда должны подходить к своей проблеме с точки зрения возможности замены динамических проверок статическими. Именно это, по существу, делает следующее утверждение о Хаскелле довольно близким к реальности:"если он компилирует, он работает". Так что определенно " нет " работе с простым JSON.

Ваше решение с FullUser и PartialUser является правильным. Хотя я бы предложил использовать другой подход к именованию: User и UserJSON - таким образом вы получаете вполне описательный и разумный смысл.

Однако есть небольшая проблема с Aeson: сгенерированные экземпляры пока не поддерживают синтаксический анализ отсутствующих полей (пожалуйста, проголосуйте по этому вопросу). Поэтому вам придется определять экземпляры вручную.

Comments

    Ничего не найдено.