Reputation: 331
I am trying to access the inner Object
in my request. This is my code:
{-# LANGUAGE OverloadedStrings #-}
import Network.Wreq
import Control.Lens
import Data.Aeson
import Data.Map as Map
type Resp = Response (Map String Value)
main = do
r <- asJSON =<< get "https://bittrex.com/api/v1.1/public/getticker?market=BTC-LTC" :: IO Resp
let result = (r ^. responseBody)
print result
This is my result:
fromList [("message",String ""),("result",Object (fromList [("Bid",Number 1.441e-2),("Ask",Number 1.44101e-2),("Last",Number 1.441e-2)])),("success",Bool True)]
I am trying to access the "result" key's Object and then access the values inside of there. I'm not sure how to do it, I've messed around with AESON and ^?
operator that wreq
provides but it's not working for me.
Upvotes: 0
Views: 259
Reputation: 33464
{-# LANGUAGE OverloadedStrings #-}
import Control.Lens
import Network.Wreq
import Data.Aeson.Lens
import Data.HashMap.Lazy (HashMap)
import Data.Text (Text)
main = do
r <- asValue =<< get "https://bittrex.com/api/v1.1/public/getticker?market=BTC-LTC"
let result =
(r :: Response Value)
-- get the Value out of the Response
^? responseBody
-- The Value must be an Object, then unwrap the contained (HashMap Text Value)
. _Object
-- In the map {"message": ..., "result": ...}, get the "result".
. ix "result"
-- This must be an Object, unwrap the (HashMap Text Value)
. _Object
print (result :: HashMap Text Value)
-- How types line up:
--
-- responseBody . _Object . ix "result" . _Object
-- :: Traversal' (Response Value) (HashMap Text Value)
--
-- responseBody :: Lens' (Response Value) Value
-- _Object :: Traversal' Value (HashMap Text Value)
-- ix "result" :: Traversal' (HashMap Text Value) Value
-- _Object :: Traversal' Value (HashMap Text Value)
Upvotes: 4