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

How can I reconstruct a JSON array from a slice using lens?

我想使用透镜提取 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。我怎样才能 "reconstruct" 一个 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)