2012-02-02 14 views
6

No es que es difícil escribir instancias ToJSON/FromJSON para los tipos generados, pero aun así, mientras genere el código, ¿podría incluirlo? ¿O hay una manera fácil de hacer que esto suceda como un usuario de Yesod? (No he cavado demasiado profundo en cómo funciona TH ...)¿Por qué no hay instancias de tipos persistentes de ToJSON/FromJSON en Yesod?

Actualización: OK, me gusta esta sugerencia, pero, dicen que es mi tipo persistente usuario. Si uso

$(deriveJSON id ''User) 

cede

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 

aparentemente porque es un alias. Pero

$(deriveJSON id ''UserGeneric) 

produce

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

probablemente he todavía tengo el tipo equivocado, pero no puedo encontrar lo suficiente sobre lo que genera permanente a conseguir el encantamiento derecha.

+0

¿Ya lo descubrió? Encontrando exactamente el mismo problema aquí. –

+0

No he estado trabajando con Yesod desde hace bastante tiempo, pero estoy bastante seguro de que esto funcionó usando el "json" añadido que se menciona en el enlace de Michael Snoyman: https: // github.com/yesodweb/yesod/wiki/Persistent-entity-syntax # json-instances – svachalek

+0

gracias, funciona :) –

Respuesta

5

De hecho, creo que agregaremos esta función a Persistent 0.8 (que se lanzará con Yesod 0.10 en una semana o dos). Es cierto lo que dflemstr dijo sobre la dependencia de la hinchazón, que es la razón por la que no hemos hecho esto en el pasado, pero ya dependemos de nuestros tipos de configuración (basados ​​en los archivos de configuración de Yaml, que usa tipos de datos de aeson).

+0

Gracias Michael, me parece bien. Mientras tanto, si alguien conoce la sintaxis correcta para la llamada deriveJSON, ¡también sería útil! – svachalek

+0

Un año después, esto todavía no funciona ... –

+3

Esto se ha implementado por un tiempo, ver: https://github.com/yesodweb/yesod/wiki/Persistent-entity-syntax#json-instances –

1

El valor predeterminado Yesod generadores de tipo no deben generar ToJSON/FromJSON casos, porque eso sería añadir una dependencia de aeson incluso si usted no desea utilizar ese paquete, lo que podría conducir a la hinchada dependencia.

Puede importar Data.Aeson.TH Utilizando este código para crear automáticamente instancias JSON:

data MyDataType = ... 

deriveJSON id ''MyDataType 

Reemplazar id con una función que cambia el nombre de los campos para usted, si usted no desea que los mismos nombres de campo en Haskell como en el archivo JSON.

2

Puede utilizar el mecanismo de derivación automática en Data.Aeson.TH.

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

Esto debería funcionar bien tanto en los tipos de datos generados por Yesod como en sus propios tipos.

Se necesita una función para personalizar los nombres de los campos de registro. Aquí, acabo de pasar id para que no cambien. See the documentation for details.

+0

Gracias, parece que ambos tenían la misma respuesta al mismo tiempo. Los tipos de Yesod son alias, por lo que genera un error de "Tipo no admitido". He intentado utilizar $ (deriveJSON id '' UserGeneric), donde es mi tipo de usuario, y obtuve esto: Kind desajuste El primer argumento de 'UserGeneric' debe tener tipo' (* -> *) -> * -> * ', pero 'backend [i5XB]' tiene kind' * ' – svachalek

8

Para cualquier persona que no se da cuenta el comentario en el post de sub Michael muñeco de nieve, en las versiones de resienten persistente que puede hacer:

Person json 
    name Text 
    age Int 

y obtener instancias toJSON y FromJSON de persona.

Cuestiones relacionadas