Пользовательский экземпляр ToJSON для постоянного ключа
Я создаю веб-приложение в Haskell. Я использую постоянную библиотеку для подключения к базе данных postgresql.
Я использую стандартную файловую систему определения схемы, в которой шаблон Haskell используется для создания типов из схемы.
share [mkPersist sqlSettings, mkMigrate "migrateAll"]
$(persistFileWith lowerCaseSettings "schema")
У меня есть много типов данных, определенных в моем файле схемы, которые выглядят так (поддельный пример):
User json
email Text
Post json
owner UserId
name Text
body Text
"json" рядом с "Post" указывает, что ToJSON / FromJSON должны быть автоматически сгенерированы платформой.
I я использую эту автоматическую генерацию экземпляров для многих из моих типов, чтобы я мог сериализовать их по сети.
Моя проблема: я хочу предоставить пользовательский экземпляр ToJSON для ключей. Например, в приведенном выше " UserId "будет"ключевым пользователем". Каждый раз для него автоматически генерируется такой экземпляр "PostId", как "Key Post" и т. д.
Когда" Post "сериализуется, он преобразует" owner "из ключа в номер индекса, например,"52".
Я хотел бы ... сериализуйте все ключи базы данных в другой стиль. Например, вместо того, чтобы производить число '52', производя строку "fiftytwo" (просто пример).
Если бы я не использовал генерацию кода, я мог бы сделать что-то вроде
instance ToJSON (Key record) where
toJSON _ = Data.Aeson.String "placeholder"
Но для этого потребуется не использовать автоматическую генерацию кода из-за перекрывающихся ошибок экземпляра. Возможно, есть способ сказать генератору кода, чтобы он не создавал экземпляры "ToJSON (Key Post)" и т. д. Для всех типов данных?
Я мог бы также просто напишите пользовательские объявления экземпляров для каждого типа, но это будет очень избыточно.
Я знаком с использованием newtypes, чтобы иметь несколько экземпляров класса типа, однако это не очень хорошо вписывается в этот сценарий.
Спасибо!