3

我正在使用 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命名空间和jsonto clojure.data.json。)

从上面可以看出,s/valid?解析 JSON 的失败是因为关键字没有命名空间。

如何调整代码以使 JSON 被视为有效?

4

1 回答 1

1

您可以执行以下操作:

(def my-json (json/read-str "{\"yes\": \"yes\"}" :key-fn #(keyword (str *ns*) %)))

我不确定这是否是处理它的正确/惯用方式 - 我想这取决于具体情况。

于 2016-08-26T14:29:16.440 回答