JSON 是一种常用的数据格式,尤其在与非 Clojure 系统交互时。JSON 对象中的所有键都是字符串(不是 Clojure 中常见的关键字)。
希望能够验证传入的 JSON 数据,并在数据格式不正确时提供有用的错误消息。Spec 是这两个功能的优秀工具,但 s/keys
仅支持关键字键。
能够指定字符串键将是非常有用的,例如,对于一些如下的 JSON 数据:
{"city" "Denver", "state" "CO"}
我想编写一个如下的 spec:
(s/def :location/city string?) (s/def :location/state string?) (s/keys :req-str [:location/city :location/state])
其中 :req-str
犹如 :req
,而 :req-un-str
就像 :req-un
。这些 spec 仍然是完全限定的关键字。
当前的解决方案
- 使用
clojure.walk/keywordize-keys
将字符串键转换为关键字键。
- 用 spec 验证。
- 如果有问题,遍历这些问题并对每个值使用
stringify-keys
。
- 适当格式化问题(基本上,复制
explain
的格式)。
这个解决方案并非特别困难,但由于我怀疑与 JSON 的交互是一个常见的用例,因此可能更有益于更直接地支持此用例。