如何使用镜头从切片中重建JSON数组?

时间:2018-08-20 17:15:22

标签: haskell lens lenses

我想使用镜头提取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数组?

1 个答案:

答案 0 :(得分:2)

_ArrayPrism。这意味着您可以将其取反以获得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)