Почему экземпляры персистентных типов ToJSON / FromJSON в Yesod отсутствуют? - PullRequest
6 голосов
/ 02 февраля 2012

Это не , что сложно написать экземпляры ToJSON / FromJSON для сгенерированных типов, но все же, пока вы генерируете код, можете ли вы это добавить? Или есть простой способ сделать это как пользователь Yesod? (Я не слишком углубился в то, как работает TH ...)

Обновление: Хорошо, мне нравится это предложение, но, скажем, мой постоянный тип - Пользователь. Если я использую

$(deriveJSON id ''User)

это дает

  Exception when trying to run compile-time code:
  Data.Aeson.TH.withType: Unsupported type: TySynD Model.User [] (AppT (ConT Model.UserGeneric) (ConT Database.Persist.GenericSql.Raw.SqlPersist))
  Code: deriveJSON (id) 'User

очевидно, потому что это псевдоним. Но

$(deriveJSON id ''UserGeneric)

выходы

Kind mis-match
The first argument of `UserGeneric' should have kind `(* -> *)
                                                      -> *
                                                      -> *',
but `backend[i5XB]' has kind `*'

Возможно, у меня все еще неправильный тип, но я не могу найти достаточно информации о том, что генерирует Persistent, чтобы получить правильное заклинание.

Ответы [ 4 ]

8 голосов
/ 08 декабря 2013

Для тех, кто не замечает подкомментарий к сообщению Майкла Сноумана, в последних версиях persistent вы можете сделать:

Person json
    name Text
    age Int

и получить ToJSON и FromJSON экземпляры Person.

5 голосов
/ 02 февраля 2012

Я действительно думаю, что мы добавим эту функцию в Persistent 0.8 (будет выпущен с Yesod 0.10 через неделю или две). Это правда, что dflemstr сказал о раздувании зависимостей, поэтому мы не делали этого раньше, но мы уже зависим от aeson для наших типов конфигурации (основанных на файлах конфигурации Yaml, которые используют типы данных aeson).

2 голосов
/ 02 февраля 2012

Вы можете просто использовать механизм автоматического получения в Data.Aeson.TH.

{-# LANGUAGE TemplateHaskell #-}
$(deriveJSON id ''Foo)

Это должно хорошо работать как для типов данных, сгенерированных Yesod, так и для ваших собственных типов.

Требуется функция для настройки имен полей записи.Здесь я только что передал id, чтобы получить их без изменений. Подробнее см. В документации .

1 голос
/ 02 февраля 2012

Генераторы типа Yesod по умолчанию не должны генерировать ToJSON / FromJSON экземпляров, потому что это добавит зависимость к aeson, даже если вы не захотите использовать этот пакет, что может привести к раздуванию зависимостей.

Вы можете импортировать Data.Aeson.TH и использовать этот код для автоматического создания экземпляров JSON:

data MyDataType = ...

deriveJSON id ''MyDataType

Замените id на функцию, которая переименовывает поля для вас, если вы не хотите использовать те же имена полей в Haskell, что и в файле JSON.

...