使用特定顺序将地图序列化为YAML

时间:2014-02-02 10:53:44

标签: haskell serialization yaml aeson

我使用yaml库来序列化Map String t类型的值(或某些类型t)。结果输出中的顺序相当随机,这是次优的,因为文件应该是人类可读的。

有没有办法控制地图的序列化顺序?或者,可能更接近问题的核心,aeson Object?如果没有,什么是合适的解决方法?

2 个答案:

答案 0 :(得分:1)

使用yamlaeson,它目前不太可能,says the yaml author,但他已经以{Data.Yaml.Builder的形式开始了对它的实验性支持{3}}模块。

答案 1 :(得分:0)

从 0.8.13 开始,yaml 包包含 Data.Yaml.Prettty 模块。这允许您配置如何漂亮地打印 yaml 文档,包括使用 setConfCompare

对字段进行排序

在我自己的一个项目中,我started using it进行了如下更改:

 writeTipToiYaml :: FilePath -> TipToiYAML -> IO ()
-writeTipToiYaml out tty = encodeFile out tty
+writeTipToiYaml out tty =
+    SBC.writeFile out (encodePretty opts tty)
+  where
+    opts = setConfCompare (compare `on` fieldIndex) defConfig
+    fieldIndex s = fromMaybe (length fields) $ s `elemIndex` fields
+    fields = map T.pack
+        [ "product-id"
+        , "comment"
+        , "welcome"
+        , "media-path"
+        , "gme-lang"
+        , "init"
+        , "scripts"
+        , "language"
+        , "speak"
+        , "scriptcodes"
+        ]