2017-05-09 23 views
0

我想從json對象中提取一個值。我有這樣的:如何在Spock中創建「ActionCtxT」?

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

和錯誤:

• 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" 

我知道這意味着什麼:與在設爲myVal線必須返回一個類型ActionCtxT的東西以及所有其它線路。或者一個純粹的價值。那麼,如何解決它?

回答

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

jsonBody'給你的方法來分析使用埃宋FromJSON實例的請求的主體。

通過將您的JSON數據映射到自定義數據類型,然後爲該數據類型提供一個FromJSON實例,通常更容易使用Aeson。

複述您可以在埃宋文檔中找到實例, 如果你的JSON看起來是這樣的:

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

然後您可以創建一個數據類型:

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

和手動創建FromJSON實例:

{-# 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 

您可以選擇自動啓動lly從您的數據類型派生FromJSON實例。

+0

重新閱讀我的問題 – Jodimoro

+0

我明白你的問題,只是以爲你錯了。如果你仍然想堅持,你可以使用'let myVal =(a :: Object)來訪問'HashMap'的值!例如「some_key」。 –

+0

id $ iot或不? - 這不是我想要的 - 我仍然想堅持。 – Jodimoro