簡體   English   中英

如何使用Text.JSON解析從Haskell中的文件讀取的字符串

[英]How do I use Text.JSON to parse a string read from a file in Haskell

我正在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":[]}}

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

然后我使用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我看到輸出,並看到輸出中的任何地方都沒有\\ sequence。 如果我只是在命令行輸入f ,我會看到如上所述的轉義序列,但我從未在任何地方看到任何多個\\ _轉義序列。

那么,最后,我究竟應該如何使用Text.JSON模塊從文件中讀取JSON數據?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM