如何用Aeson追溯解析错误? [+答案]

时间:2013-11-28 14:52:08

标签: haskell aeson

我要解析大的(> 1Mb)简单JSON文件。 我使用Aeson,遵循他们的Haskell学校的fpcomplete教程(谢谢你们,顺便说一句)。

由于某些文件(并非全部)失败,我怀疑json文件不尊重我期望的结构。我到目前为止的错误信息已经

> Failed reading: satisfy

我的问题是:

  • “我怎样才能获得有关出错的更多细节?”

两个级别的调试/记录/跟踪构成了我的目标:

  • 识别解析器,即无法解析哪种数据类型(如Parsec)
  • 使用行/字符编号识别数据

2 个答案:

答案 0 :(得分:8)

不幸的是,Aeson交换了很好的错误消息以提高速度。但是,您可以执行多阶段解码,只要您的JSON结构很好并且文件失败了您的架构,而不是完全解析为JSON。

通过多相我的意思是一次解码部分结构。您也可以收集失败的值,以确定它们解析失败的原因。

parse :: FromJSON a => ByteString -> Maybe [Either Value a]
parse s = case decode s of
  Nothing -> fail "could not decode as array"
  Just values -> map tryDecode values
where
  tryDecode :: FromJSON a =>Value -> Either Value a
  tryDecode v = case decode (encode v) of
    Nothing -> Left v
    Just a -> Right a

decode . encode位通过ByteString往返是非常低效的,但可以通过使用更基本的Aeson解析器来改进。

答案 1 :(得分:1)

有一个解决方案:aeson-better-errors是Harry Garrood同名套餐的精彩教程。事实证明,这个软件包既可以直接使用,而可以提供我正在寻找的信息。

一句话:这个包将解决结构错误,比如缺少大括号。对于那种类型的错误,您仍然会收到未在输入流中本地化的InvalidJSON消息。