2012-07-05 51 views
1

我在Haskell中編寫了一個應用程序,其中作爲持久性系統的一部分,我將數據結構轉換爲JSON格式,然後編寫它們到磁盤。稍後,我想通過讀取文件並通過JSON解析器運行它來重新載入它們以重建對象。如何使用Text.JSON解析從Haskell中的文件中讀取的字符串

但是,在讀取部分出現問題,導致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":[]}} 

依此類推等等。文件中的每一行代表一個我已經序列化的完整對象。

然後我用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,我會看到上面的轉義序列,但我從來沒有在任何地方看到任何多個\轉義序列。

那麼,到底怎麼樣,我應該從文件讀取JSON數據使用Text.JSON模塊?

回答

3

每一行都是有效的JSON,但整個文件不是,所以你需要逐行解碼。像(未經測試):

map (decode :: String -> Result WorkoutEvent) $ lines f 
+1

head - > desk。這確實是正確的。謝謝。 – 2012-07-05 19:16:43