2012-07-05 52 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