16

解析する大きな (>1Mb) シンプルな JSON ファイルがあります。彼らの School of Haskell の fpcomplete のチュートリアルに従って、私は Aeson を使用しました (皆さん、ありがとうございました)。

一部のファイル (すべてではない) が失敗するため、json ファイルが想定している構造を尊重していないと思われます。今までに受け取ったエラーメッセージは

> Failed reading: satisfy

私の質問は:

  • 「問題の詳細を確認するにはどうすればよいですか?」

デバッグ/ロギング/トレースの 2 つのレベルが私の目標を構成します。

  • パーサーの識別、つまり解析できなかったデータ型 (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 に答える