我想使用镜头提取 JSON 数组的一部分,并取回Value
。更具体地说,我正在尝试执行以下操作:
$ import qualified Data.ByteString.Lazy as LBS
$ import Data.Aeson.Lens
$ import Control.Lens
$ let e = "{"headers":[["Host","localhost:9090"],["Accept-Encoding","gzip"]]}" :: LBS.ByteString
$ e ^? key "headers" . nth 0 . _Array . sliced 0 2
$ Just [String "Host",String "localhost:9090"]
它有效,但我希望结果是Value
而不是List
.如何将 JSON 数组"重建"为镜头表达式的一部分?
_Array
是一个Prism
。这意味着您可以反转它以获得re _Array :: AsValue t => Getter (Vector Value) t
。
e ^? key "headers" . nth 0 . _Array . sliced 0 2 . re _Array
您也可以使用over
(或其别名(%~)
(:
e ^? key "headers" . nth 0 . to (over _Array (slice 0 2))
e ^? key "headers" . nth 0 . to (_Array %~ slice 0 2)