查询Object的属性

时间:2016-06-25 17:38:17

标签: haskell lens aeson

什么是Aeson相当于javascript属性访问器。

您如何将javascript语句x.a.b翻译成Haskell?

例如,给定someObject :: Object包含例如:

{ a:
  { b:
    [ 1
    , 2
    ]
  }
}

为上述内容返回[1,2]的函数会是什么样的。

我正在寻找这个问题的答案,看来这个问题的答案是"使用镜头"。我似乎无法弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:1)

这是镜头解决方案:

 {-# LANGUAGE OverloadedStrings #-}

 import Data.Text
 import Data.Aeson
 import Data.Aeson.Lens
 import Control.Lens

 Just obj1 = decode ("{ \"a\": { \"b\": [ 3,4,5] } }" ) :: Maybe Value
 Just obj2 = decode ("{ \"a\": { \"d\": true } }" ) :: Maybe Value

 test1 = (Just obj1) ^. (key "a" ) ^. (key "b") :: Maybe Value
 test2 = (Just obj2) ^. (key "a" ) ^. (key "b") :: Maybe Value

请注意,您必须使用Maybe Value启动链。

如果有帮助,这是一个非镜头答案:

 {-# LANGUAGE OverloadedStrings #-}

 import Data.Aeson
 import qualified Data.HashMap.Strict as HM

 -- access .a.b
 get_a_b :: Object -> Maybe Value
 get_a_b hm = do
   v <- HM.lookup "a" hm
   hm2 <- case v of
            (Object hm2) -> return hm2
            _            -> Nothing
   HM.lookup "b" hm2