Haskellでアプリケーションを作成しています。このアプリケーションでは、永続化システムの一部として、データ構造をJSON形式に変換してから、ディスクに書き込みます。後で、ファイルを読み取り、JSONパーサーを介して実行してオブジェクトを再構成することにより、それらをロードしたいと思います。
ただし、読み取り部分で問題が発生し、JSONモジュールが文字列を解析できなくなります。
まず、仕事にText.JSON(json-0.5)を使用しています。私がファイルに書き込んでいるデータ型はと呼ばれ、次のWorkoutEvent
コマンドを使用して、JSONに完全にエンコードおよびデコードされることを確認しました。
decode $ encode evt :: Result WorkoutEvent
したがって、それを念頭に置いて、一連のイベントを作成してファイルに書き込むと、結果のファイルは次のようになります(テキストエディターで開いた場合)。
{"type":"AddWorkout","data":{"uuid":"473b7964-8197-49ac-be3b-2b3804f1fbb5","date":"2012-03-30","workout_type":"Pushups","description":"","sets":[6]}}
{"type":"AddWorkout","data":{"uuid":"9f83363a-5298-4778-9c80-7dfa0d2ea6f9","date":"2012-04-02","workout_type":"Pushups","description":"","sets":[6,6]}}
{"type":"AddWorkout","data":{"uuid":"a60806a0-efd6-4647-bc62-a48298ce55cd","date":"2012-04-04","workout_type":"Pushups","description":"","sets":[]}}
などなど。ファイルの各行は、私がシリアル化した1つの完全なオブジェクトを表しています。
次に、readFileを使用してファイルをロードしましたが、問題はありません。
*Main> f <- readFile "/home/savanni/Documents/workouts.json-stream"
*Main> take 50 f
"{\"type\":\"AddWorkout\",\"data\":{\"uuid\":\"473b7964-8197"
*Main> putStrLn $ take 50 f
{"type":"AddWorkout","data":{"uuid":"473b7964-8197
ここまでは順調ですね。データをデコードしようとすると、問題が発生します。
*Main> decode f :: Result [WorkoutEvent]
Error "Invalid tokens at end of JSON string: \"{\\\"type\\\":\\\"A\""
私putStrLn f
が出力を見て、出力のどこにも\シーケンスがないことを確認すると言います。コマンドラインで入力するだけf
で、上記のようなエスケープシーケンスが表示されますが、複数の\エスケープシーケンスはどこにも表示されません。
それで、最終的に、Text.JSONモジュールを使用してファイルからJSONデータをどの程度正確に読み取ることになっていますか?