我的类型和对应的 FromJSON 实现如下所示。
将nonEmpty
aList
变为 a Maybe NonEmpty
,我正在尝试正确处理List
确实为空并且我必须中止解析的情况。这个解析实际上是在 内部完成的parseJsonBody
,这意味着我不想error "foo"
摆脱它,但我想返回mzero
(或者其他任何可以解决问题的方法,这mzero
是我迄今为止唯一偶然发现的东西)所以处理程序正确返回 400 而不是以 500 崩溃。
下面的方法可以编译,但据我所知,它几乎等于error
或在 parseJSON 内抛出某种其他形式的异常。但是,如果我返回mzero
(例如,用<*> mzero
而不是那条线),它会按预期很好地失败。
import qualified Data.List.NonEmpty as NE
data GSAnswer = GSAnswer { gsAnswerQuestionId :: Int
, gsAnswerResponses :: NE.NonEmpty GSResponse
} deriving (Show, Eq)
instance FromJSON GSAnswer where
parseJSON (Object o) =
GSAnswer <$> o .: "question-id"
-- how do I return mzero here based on NE.nonEmpty?
-- this will throw an exception right now on an empty list
<*> fmap (fromMaybe (fail "foo") . NE.nonEmpty) (o .: "responses")
parseJSON _ = mzero
一种选择是以某种方式对 的结果进行模式匹配fmap NE.nonEmpty (o .: "responses")
,但我不太清楚那里的模式是什么:看起来 Parser 没有任何构造函数吗?