什么是Aeson相当于javascript属性访问器。
您如何将javascript语句x.a.b
翻译成Haskell?
例如,给定someObject :: Object
包含例如:
{ a:
{ b:
[ 1
, 2
]
}
}
为上述内容返回[1,2]
的函数会是什么样的。
我正在寻找这个问题的答案,看来这个问题的答案是"使用镜头"。我似乎无法弄清楚如何做到这一点。
答案 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