Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用lens aeson从JSON ByteString获取值集合_Json_Haskell_Haskell Lens_Aeson - Fatal编程技术网

使用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)