2017-05-09 4 views
0

Je souhaite extraire une valeur d'un objet json. Et j'ai ceci:Comment créer "ActionCtxT" dans Spock?

post "/test" $ do 
     a <- jsonBody' 
     let b = show (a :: Object) -- works well 
     myVal <- (a :: Object) .: "some_key" -- error 
     text "test123" 

Et l'erreur:

• Couldn't match type ‘aeson-1.0.2.1:Data.Aeson.Types.Internal.Parser’ 
        with ‘ActionCtxT() (WebStateM() MySession MyAppState)’ 
     Expected type: ActionCtxT() (WebStateM() MySession MyAppState) a0 
     Actual type: aeson-1.0.2.1:Data.Aeson.Types.Internal.Parser a0 
    • In a stmt of a 'do' block: 
     myVal <- (a :: Aeson.Object) Aeson..: "some_key" 

Je sais ce que cela signifie: la ligne avec myVal doit retourner quelque chose du type ActionCtxT ainsi que toutes les autres lignes. Ou une valeur pure. Ainsi, comment le réparer?

Répondre

0
jsonBody' :: (MonadIO m, FromJSON a) => ActionCtxT ctx m a 

jsonBody' vous cède la place à analyser le corps de la requête en utilisant une instance Aeson FromJSON.

Il est généralement plus facile d'utiliser Aeson en mappant vos données JSON à un type de données personnalisé, puis en fournissant une instance FromJSON pour ce type de données.

paraphrasant l'exemple que vous pouvez trouver dans la documentation Aeson, Si votre JSON ressemble à ceci:

{ "name": "Joe", "age": 12 } 

Ensuite, vous pouvez créer un type de données:

data Person = Person { 
     name :: Text 
    , age :: Int 
    } deriving Show 

et créer manuellement le FromJSON exemple:

{-# LANGUAGE OverloadedStrings #-} 

instance FromJSON Person where 
    parseJSON (Object v) = Person <$> 
          v .: "name" <*> 
          v .: "age" 
    -- A non-Object value is of the wrong type, so fail. 
    parseJSON _   = empty 

Votre alternative Dérivez l'instance FromJSON de votre type de données.

+0

relire ma question – Jodimoro

+0

J'ai compris votre question, je pensais que vous étiez dans le mauvais sens. Si vous voulez toujours persister, vous pouvez accéder à la valeur 'HashMap' en utilisant' let myVal = (a :: Object)! "some_key" 'par exemple. –

+0

id $ iot ou non? - Ce n'est pas ce que je veux - je veux toujours persister. – Jodimoro