有没有一种方法可以指导clojure.core.edn/read如何解析自动命名空间的关键字?
(edn/read-string "{:not-namespaced \"ko\" }") ;;=> {:not-namespaced "ko"}
(edn/read-string "{:namespaced/ok \"ko\" }") ;;=> #:namespaced{:ok "ko"}
(edn/read-string "{::namespaced \"ko\" }") ;;=> Unhandled java.lang.RuntimeException Invalid token: ::namespaced autonamespaced does not work最后一个例外是合理的,因为“关键字不能以:”开头:。
我可以在这个简单的例子中使用load-file,但是我也需要edn (读取自定义标记)的可扩展性。
如果有一个参数来指示如何解析名称空间,将使我的配置文件(使用clojure.spec胁迫)更易读。
发布于 2016-07-26 16:55:03
因此,在我的示例中,最简单的解决方案是在配置文件中使用带有非名称空间关键字的clojure.spec (我不知道它能做到这一点)。
使用核心阅读器功能也会奏效。
引用亚历克斯·米勒的话说:
是的,您需要在edn配置文件中使用完整的名称空间,您也可以用req-un和opt-un在不合格的键上编写规范。 无论是普通核心读取器fns还是clojure.edn读取器fns都应该能够读取带有标记的文字,但是使用#,您只需要绑定调用就可以设置读取器。
发布于 2019-09-18 22:41:43
我喜欢在解析字符串之前对其进行转换,以便保持edn文件的干净,而不必将规范键视为不合格的。
(-> "{::namespaced \"ko\" }"
(#(string/replace % #"::" ":some.namespace/"))
(edn/read-string))在写入和重新读取edn文件时,这可能不是非常健壮,但是对于配置数据来说,它工作得很好。
https://stackoverflow.com/questions/38593698
复制相似问题