解析json与镜头 - aeson

时间:2013-10-21 00:47:48

标签: json haskell lens

试试Edward Kmett的思维扩展镜头和镜头 - aeson包装。这是一个热身

s = "{ \"somekey\" : [ { \"deeperkey\" : 1} , {\"deeperkey\": 2, \"otherkey\":3}]}

期望的结果是

[(1, Nothing), (2, Just 3)]

我可以用

取得一些进展
import Control.Lens.Aeson
import Control.Lens
import Control.Monad
import qualified Data.Vector as V

λ> s ^. key "somekey" . _Array . to V.toList >>= (^.. key "deeperkey" . _Number)
[1,2]

但到目前为止,我还没有弄清楚如何努力工作组合器以获得正确的答案。 我最有可能涉及片段'key“otherkey”'。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

试试这个

s ^.. key "somekey" . _Array . traverse 
                    . to (\o -> ( o ^?! key "deeperkey" . _Number
                                , o ^?  key "otherkey"  . _Number
                                )
                         )

使用(^..)traverse TraversalArray获取多个元素,以匹配"somekey"广告位中的多个值。从技术上讲,key "deeperkey"应该被允许失败,但根据你的回报类型,你做出了强有力的假设 - 它不会 - 所以我们使用(^?!)来做失败的(^?)没有Maybe monad进行保护。