16

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

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

> Failed reading: satisfy

我的问题是:

  • “我怎样才能得到更多关于哪里出了问题的细节?”

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

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

2 回答 2

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 解析器来改进。

于 2013-11-28T15:03:40.487 回答
1

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

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

于 2017-01-16T13:48:38.173 回答