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

Tit*_*tou 16 haskell aeson

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

由于一些文件(而不是全部)失败,我怀疑json文件不尊重我期望的结构.到目前为止我收到的错误消息已经存在

> Failed reading: satisfy
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • "我怎么能得到更多关于出了什么问题的细节?"

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

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

J. *_*son 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
Run Code Online (Sandbox Code Playgroud)

decode . encode由于它通过ByteString进行往返,因此该位非常低效,但可以通过使用更基本的Aeson解析器来改进.


Tit*_*tou 1

有一个解决方案:aeson-better-errors是 Harry Garrood 的同名包的很好的教程。事实证明,这个包既易于使用,又提供了我正在寻找的信息。

备注:该软件包无法解决结构错误,例如缺少大括号。对于此类错误,您仍然会收到未在输入流中本地化的 InvalidJSON 消息。