我使用该yaml
库来序列化类型Map String t
(或某些类型 t)的值。结果输出中的顺序是相当随机的,这是次优的,因为文件应该是人类可读的。
有没有办法控制地图的序列化顺序?或者,可能更接近问题的核心,一个 aeson Object
?如果没有,什么是合适的解决方法?
我使用该yaml
库来序列化类型Map String t
(或某些类型 t)的值。结果输出中的顺序是相当随机的,这是次优的,因为文件应该是人类可读的。
有没有办法控制地图的序列化顺序?或者,可能更接近问题的核心,一个 aeson Object
?如果没有,什么是合适的解决方法?
作者说,使用yaml
或aeson
基于它,目前不容易实现,但他已经开始以Data.Yaml.Builder模块的形式对它进行一些实验性支持。yaml
从 0.8.13 开始,yaml
包中包含Data.Yaml.Prettty
模块。这允许您配置如何漂亮地打印 yaml 文档,包括使用排序字段setConfCompare
在我自己的一个项目中,我开始使用它并进行如下更改:
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"
+ ]