试试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”'。有什么想法吗?
答案 0 :(得分:3)
试试这个
s ^.. key "somekey" . _Array . traverse
. to (\o -> ( o ^?! key "deeperkey" . _Number
, o ^? key "otherkey" . _Number
)
)
使用(^..)
从traverse
Traversal
和Array
获取多个元素,以匹配"somekey"
广告位中的多个值。从技术上讲,key "deeperkey"
应该被允许失败,但根据你的回报类型,你做出了强有力的假设 - 它不会 - 所以我们使用(^?!)
来做失败的(^?)
没有Maybe
monad进行保护。