Частичный разбор JSON-объектов с aeson в Haskell
Я делаю довольно простой веб-сервис CRUD в Haskell с варпом (и, возможно, Скотти) и кислотным состоянием.
В кислотном состоянии я храню записи пользователей в данных.Карта (согласноэтому примеру). Я знаю, что эти записи всегда будут полными при создании, поэтому мне не нужно квалифицироваться с большим количеством "может быть". Однако при обновлении пользователя клиент может выбрать отправку частичного объекта json с заполнением только некоторых полей.
Каким был бы идиоматический способ представляете это? Я должен был одним данным декларации, FullUser, без "может", а точно так же, с "Может быть" перед все дополнительные ключи, PartialUser, и пусть aeson автоматически получают кодирования и декодирования для последней, наконец, написать свою собственную функцию обновления типа :: FullUser -> PartialUser -> FullUser?
Это был бы не очень большой код, но он чувствует себя немного уродливым и как будто немного нарушает сухость. Это должно быть такой распространенной задачей в веб-сервере, так что, возможно, это уже было были решены обобщенно (возможно, с помощью TH)?
Я понимаю, что я мог бы просто хранить строку json и всегда проверять отсутствие ключей, что делает ее немного неуклюжей, но более надежной для будущих изменений схемы, но я все равно хотел бы знать, как я буду делать это "типобезопасным" способом.
Править:
Или, возможно, я должен иметь только FullUser и использовать aeson-lens, чтобы написать простую функцию обновления из FullUser и строки json?
1 ответ:
Идиоматический Хаскелл делает как можно больше статических проверок. Вы всегда должны подходить к своей проблеме с точки зрения возможности замены динамических проверок статическими. Именно это, по существу, делает следующее утверждение о Хаскелле довольно близким к реальности:"если он компилирует, он работает". Так что определенно " нет " работе с простым JSON.
Ваше решение с
FullUserиPartialUserявляется правильным. Хотя я бы предложил использовать другой подход к именованию:UserиUserJSON- таким образом вы получаете вполне описательный и разумный смысл.Однако есть небольшая проблема с Aeson: сгенерированные экземпляры пока не поддерживают синтаксический анализ отсутствующих полей (пожалуйста, проголосуйте по этому вопросу). Поэтому вам придется определять экземпляры вручную.
Comments