2012-02-02 22 views
6

それはあなたがコードを生成している間、まだ生成された型のためToJSON/FromJSONインスタンスを書くのは難しいけどはあなたがいることを投げることができることをではありませんか?または、これをYesodユーザーとして行うための簡単な方法はありますか?なぜ、永続型はYesodのToJSON/FromJSONのインスタンスではありませんか?

アップデート(私は... THがどのように機能するかにあまりにも深く掘っていない): OKを、私はこの提案を気に入ったが、私の永続的なタイプがユーザーであると言います。私は

​​

を使用している場合、それは別名だから、それは明らかに

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

は、私はおそらくまだ間違った型を持っているが、私は右の呪文を取得するために生成永続的なものについての十分なを見つけることができません。あなたは依存関係の肥大化につながる可能性がそのパッケージを、使いたくなかった場合でも、それはaesonへの依存性を追加しますので

+0

これはまだ分かっていますか?ここでまったく同じ問題にぶつかります。 –

+0

私は今、かなり長い間イェソドで作業されていないが、私はこのマイケルSnoymanのリンクに記載された追加「JSON」を使用して作業していたかなり確信します。https:// githubのを。com/yesodweb/yesod/wiki /永続的なエンティティ構文#json-instances – svachalek

+0

ありがとう、それは動作します:) –

答えて

5

私は実際に私たちが(週または2にイェソド0.10でリリースされる)0.8永続的にこの機能を追加することと思います。 dflemstrが依存関係の肥大化について語ったことは事実です。これは過去にこれを行っていない理由ですが、私たちは既にaesonのデータ型を使用するYaml設定ファイルに基づいて、現在の設定タイプに依存しています。

Person json 
    name Text 
    age Int 

と人のToJSONとFromJSONのインスタンスを取得する:あなたが行うことができます永続的なの再送バージョンでマイケル雪だるまのポストにサブコメントを、気づいていない人のため

+0

ありがとうマイケルは、私によく聞こえる。その間に誰もderiveJSON呼び出しの正しい構文を知っていれば助けになるでしょう! – svachalek

+0

1年後、これはまだ動作していません... –

+3

これはしばらくの間実行されています。https://github.com/yesodweb/yesod/wiki/Persistent-entity-syntax#json-instances –

1

デフォルトのイェソドタイプの発電機は、ToJSON/FromJSONのインスタンスを生成してはなりません。

あなたはData.Aeson.THをインポートし、自動的にJSONインスタンスを作成するには、このコードを使用することができます:あなたはのように、Haskellでは同じフィールド名をしたくない場合は

data MyDataType = ... 

deriveJSON id ''MyDataType 

は、あなたのためのフィールドの名前を変更する機能をidを交換してくださいJSONファイル

2

は、あなただけのData.Aeson.THに自動導出メカニズムを使用することができます。

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

これは、Yesodで生成されたデータ型だけでなく、独自の型でも正常に動作するはずです。

これは、レコードのフィールド名をカスタマイズする機能を取ります。ここでは、私はちょうどidを渡してそれらを変更しません。 See the documentation for details

+0

ありがとう、同じ時に両方の同じ答えがあったように見えます。 Yesodの型はエイリアスですが、 "Unsupported type"というエラーが生成されます。私は$を使用してみました(deriveJSON番号 '' 私のタイプがユーザーであるUserGeneric)、そしてこの得た: 'UserGenericの最初の引数は 種類の不一致 を」'種類持っている必要があります(* - > *) - > * - > * '、 しかし 'バックエンド[i5XB]は種類が' *' – svachalek

関連する問題