4

试用 Edward Kmett 的思维扩展镜头和 lens-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"'。有任何想法吗?

4

1 回答 1

3

尝试这个

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

(^..)中获取多个元素traverse TraversalArray匹配"somekey"插槽中的多个值。从技术上讲,key "deeperkey"应该允许失败,但根据您的返回类型,您会做出强烈的假设,即它不会——所以我们习惯在没有单子保护的情况下(^?!)进行失败。(^?)Maybe

于 2013-10-21T00:58:17.503 回答