2012-02-02 2 views
6

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

Update: ОК, мне нравится это предложение, но, скажем, мой настойчивый тип пользователя. Если я использую

$(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 `*' 

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

+0

Вы уже поняли это? Здесь вы столкнулись с той же проблемой. –

+0

Я уже давно не работаю с Yesod, но я уверен, что у меня это работало, используя добавленный «json», упомянутый в ссылке Майкла Снояна: https: // github.com/yesodweb/yesod/wiki/Persistent-entity-синтаксис # json-экземпляры – svachalek

+0

спасибо, он работает :) –

ответ

5

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

+0

Спасибо, Майкл, звучит хорошо для меня. Тем временем, если кто-то знает правильный синтаксис вызова deriveJSON, который также будет полезен! – svachalek

+0

Годом позже это все еще не работает ... –

+3

Это было реализовано некоторое время, см. Https://github.com/yesodweb/yesod/wiki/Persistent-entity-syntax#json-instances –

1

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

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

data MyDataType = ... 

deriveJSON id ''MyDataType 

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

2

Вы можете использовать автоматический механизм вывода в Data.Aeson.TH.

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

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

Для настройки имен полей записи требуется функция. Здесь я только что прошел id, чтобы получить их без изменений. See the documentation for details.

+0

Спасибо, похоже, что у вас обоих один и тот же ответ. Типы Yesod - это псевдонимы, поэтому он генерирует ошибку «Неподдерживаемый тип». Я попытался с помощью $ (deriveJSON идентификатор '' UserGeneric), где мой тип является пользователь, и получил это: Добрые неправильно матч Первый аргумент 'UserGeneric» должен иметь вид '(* -> *) -> * -> * ', , но 'backend [i5XB]' имеет вид' * ' – svachalek

8

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

Person json 
    name Text 
    age Int 

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