使用lens aeson从JSON ByteString获取值集合
假设我有一个类似于使用lens aeson从JSON ByteString获取值集合,json,haskell,haskell-lens,aeson,Json,Haskell,Haskell Lens,Aeson,假设我有一个类似于 { messages: [ {...}, {...} ] } 我想用镜头从中得到一个信息列表/向量。我有一个toMessage函数,可以将值转换为可能的消息 我试过这篇作文key“messages”。价值观toMessage(to来自Control.Lens.Getter,但结果是可能是Message,它只会变成Nothing 目前我正在做这件事 msgsJson <- c ^? key "messages" let m
{
messages: [
{...},
{...}
]
}
我想用镜头从中得到一个信息列表/向量。我有一个toMessage
函数,可以将值
转换为可能的消息
我试过这篇作文key“messages”。价值观toMessage
(to
来自Control.Lens.Getter
,但结果是可能是Message
,它只会变成Nothing
目前我正在做这件事
msgsJson <- c ^? key "messages"
let msgs = toList $ mapMaybe message $ msgsJson ^.. values
msgsJsonHmm,这对我很有用:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.ByteString (ByteString)
import Control.Lens
import Data.Aeson
import Data.Aeson.Lens
newtype Message =
Message Integer
deriving (Show)
toMessage :: Value -> Maybe Message
toMessage json_ = do
i <- json_ ^? key "a" . _Integer
return (Message i)
input :: ByteString
input = "{\"messages\":[{\"a\":1},{\"a\":2},{\"a\":3}]}"
main :: IO ()
main =
print (input ^.. (key "messages" . values . to toMessage))
如果您得到的是Nothing
,这可能意味着您的JSON无效(您可以使用decode JSON::Maybe Value
测试它)。或者构图中的任何其他光学元件都出现故障。对于长点光学元件,有时很难准确判断哪一个出现故障,除非从末端剪掉部分并重试。但您的合成光学元件键“messages”。值。到消息
应该可以正常工作™.
顺便说一下:
msgJson <- c ^? key "messages"
let msgs = toList $ mapMaybe message $ msgsJson ^.. values
嗯,我得再试一次。看看我第一次做错了什么。
msgJson <- c ^? key "messages"
let msgs = toList $ mapMaybe message $ msgsJson ^.. values
msgJson <- c ^? key "messages"
let msgs = toList $ msgsJson ^.. (values . to message . _Just)
msgJson <- c ^? key "messages"
let msgs = msgsJson ^.. (values . to message . _Just)
let msgs = c ^.. (key "messages" . values . to message . _Just)