Парсинг JSON haskell

Я пытаюсь получить доступ к внутреннему Object по моей просьбе. Это мой код:

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

Это мой результат:

fromList [("message",String ""),("result",Object (fromList [("Bid",Number 1.441e-2),("Ask",Number 1.44101e-2),("Last",Number 1.441e-2)])),("success",Bool True)]

Я пытаюсь получить доступ к объекту ключа "результата", а затем получить доступ к значениям внутри него. Я не уверен, как это сделать, я возился с AESON и ^? оператор, который wreq обеспечивает, но это не работает для меня.

1 ответ

{-# 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)
Другие вопросы по тегам