【问题标题】:How do I use Text.JSON to parse a string read from a file in Haskell如何使用 Text.JSON 解析从 Haskell 文件中读取的字符串
【发布时间】:2012-07-05 19:09:32
【问题描述】:

我正在用 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,我会看到输出并看到输出中的任何地方都没有 \ 序列。如果我只是在命令行输入f,我会看到如上所示的转义序列,但我从未在任何地方看到任何多个-\ 转义序列。

那么,最后,我应该如何使用 Text.JSON 模块从文件中读取 JSON 数据?

【问题讨论】:

    标签: json haskell


    【解决方案1】:

    每一行都是有效的 JSON,但整个文件不是,所以你需要逐行解码。类似(未经测试):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      相关资源
      最近更新 更多