如何解决edn/read 不维护序列的顺序
我正在使用 clojure 库来读取 edn 文件 现在我的 data.edn 文件看起来像这样。
{:mysites {:locations ["priorityLoc1" "priorityLoc2" "priorityLoc3"]
:back-up ["backup1uri" "backup2uri"]}
}
现在,当我使用 edn/read 时,返回的地图看起来像
{:mysites {:locations ["priorityLoc2" "priorityLoc1" "priorityLoc3"]
:back-up ["backup1uri" "backup2uri"]}
}
正如您在上面的序列位置中看到的,值的位置,即priorityLoc2 和priorityLoc1 发生了变化。 这会导致按优先级顺序查找站点位置的应用程序出现问题。 我不确定为什么在 edn/read 期间顺序会改变,有没有办法确保序列的顺序没有改变??
我尝试了 edn/read,如 edn/read 的文档页面中所示 https://clojuredocs.org/clojure.edn/read
(defn load-edn
"Load edn from an io/reader source (filename or io/resource)."
[source]
(try
(with-open [r (io/reader source)]
(edn/read (java.io.PushbackReader. r)))
(catch java.io.IOException e
(printf "Couldn't open '%s': %s\n" source (.getMessage e)))))
(catch RuntimeException e
(printf "Error parsing edn file '%s': %s\n" source (.getMessage e)))))))
更新:
当我传递我的数据 edn 文件时,我能够看到 edn/read 正在更改顺序,我正在尝试使用较小的数据文件复制该问题,因为我无法在此处共享我的 data.edn 文件。使用较小的数据文件时,该问题无法重现。
所以,我不太确定 edn/read 不会改变顺序,edn 是否有可能尝试进行排序(如按名称排序?),这会导致顺序改变。 有没有办法确保订单不会改变。 下面是edn阅读器的代码。
(require '[clojure.java.io :as io])
(require '[clojure.tools.reader.edn :as edn])
(require '[clojure.tools.reader.reader-types :as readers])
(defn meine-edn-reader
"Load edn from an io/reader source (filename or io/resource)."
[source]
(try
(with-open [reader (io/reader source)]
(-> reader
readers/push-back-reader
readers/indexing-push-back-reader
edn/read))
(catch java.io.IOException e
(printf "Couldn't open '%s': %s\n" source (.getMessage e)))))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。