如何使用镜头从切片重建 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)
我想使用透镜提取 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)