我正在使用 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)))))