命名空间关键字使 JSON 的规范无效
Namespaced keyword makes spec for JSON invalid
我正在使用 Clojure.spec 来验证 JSON 的结构(然后将其转化为另一种格式):
(s/def ::yes string?)
(s/def ::my-test (s/keys :req [::yes]))
(def my-json (json/read-json "{\"yes\": \"yes\"}")) ; => {:yes "yes"}
(s/valid? ::my-test my-json) ; => false
(s/valid? ::my-test {::yes "yes"}) ; => true
(s/explain ::my-test {:yes "yes"})
; => val: {:yes "yes"} fails spec: :spec.core/my-test predicate:
; (contains? % :spec.core/yes)
(这里的s
指的是clojure.spec
命名空间,json
指的是clojure.data.json
。)
如上所示,s/valid?
解析失败 JSON,因为关键字没有命名空间。
我如何调整代码以使 JSON 被视为有效?
您可以执行以下操作:
(def my-json (json/read-str "{\"yes\": \"yes\"}" :key-fn #(keyword (str *ns*) %)))
我不确定这是否是 right/idiomatic 的处理方式 - 我想这取决于具体情况。
我正在使用 Clojure.spec 来验证 JSON 的结构(然后将其转化为另一种格式):
(s/def ::yes string?)
(s/def ::my-test (s/keys :req [::yes]))
(def my-json (json/read-json "{\"yes\": \"yes\"}")) ; => {:yes "yes"}
(s/valid? ::my-test my-json) ; => false
(s/valid? ::my-test {::yes "yes"}) ; => true
(s/explain ::my-test {:yes "yes"})
; => val: {:yes "yes"} fails spec: :spec.core/my-test predicate:
; (contains? % :spec.core/yes)
(这里的s
指的是clojure.spec
命名空间,json
指的是clojure.data.json
。)
如上所示,s/valid?
解析失败 JSON,因为关键字没有命名空间。
我如何调整代码以使 JSON 被视为有效?
您可以执行以下操作:
(def my-json (json/read-str "{\"yes\": \"yes\"}" :key-fn #(keyword (str *ns*) %)))
我不确定这是否是 right/idiomatic 的处理方式 - 我想这取决于具体情况。