1

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

0 回答 0