7

生成された型のToJSON/FromJSONインスタンスを作成するのはそれほど難しくありませんが、それでも、コードを生成している間にそれを投入できますか?または、Yesodユーザーとしてこれを実現する簡単な方法はありますか?(私はTHがどのように機能するかについてあまり深く掘り下げていません...)

更新: OK、私はこの提案が好きですが、私の永続的なタイプはユーザーだと言います。使用する場合

$(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

4 に答える 4

10

Michael Snowmanの投稿のサブコメントに気付いていない人は、resentの再送バージョンで次のことができます。

Person json
    name Text
    age Int

PersonのToJSONインスタンスとFromJSONインスタンスを取得します。

于 2013-12-08T12:44:11.267 に答える
6

実際、この機能をPersistent 0.8に追加すると思います(Yesod 0.10で1〜2週間でリリースされる予定です)。dflemstrが依存関係の肥大化について言ったことは事実です。これが過去にこれを行っていない理由ですが、構成タイプはすでにaesonに依存しています(aesonのデータ型を使用するYaml構成ファイルに基づく)。

于 2012-02-02T06:05:41.887 に答える
2

で自動派生メカニズムを使用できますData.Aeson.TH

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

これは、Yesodで生成されたデータ型と独自の型の両方で正常に機能するはずです。

レコードフィールド名をカスタマイズする機能が必要です。ここで、私はidそれらを変更しないようにするために合格しました。詳細については、ドキュメントを参照してください

于 2012-02-02T01:44:45.287 に答える
1

デフォルトのYesodタイプジェネレーターはToJSON/FromJSONインスタンスを生成しないはずaesonです。これは、そのパッケージを使用したくない場合でも依存関係が追加され、依存関係が肥大化する可能性があるためです。

Data.Aeson.THこのコードをインポートして使用すると、JSONインスタンスを自動的に作成できます。

data MyDataType = ...

deriveJSON id ''MyDataType

idHaskellでJSONファイルと同じフィールド名を使用したくない場合は、フィールドの名前を変更する関数に置き換えてください。

于 2012-02-02T01:44:18.560 に答える