JSON是一种常用的数据格式,特别是当与非Clojure系统接口时。JSON对象中所有键都是字符串(而不是关键字,这是Clojure中常见的)。
能够验证传入的JSON数据,并在数据格式不良时提供有用的错误信息很有用。Spec是完成这两项任务都很好的工具,但`s/keys
`只适用于关键字键。
能够指定字符串键将是有用的,例如,给定一些JSON数据,如
{"city": "Denver", "state": "CO"}
我想编写一个规范如下
(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
一样。这些规范仍然是完全限定的关键字。
当前的解决方案
- 使用
clojure.walk/keywordize-keys
将字符串键转换为关键字键
- 通过规范进行验证
- 如果有问题,遍历问题并使用每个val的
stringify-keys
- 适当地格式化问题(基本上,重现
explain
的格式化)。
这个解决方案并不特别困难,但由于我怀疑处理JSON是一个常见的用例,可能更有用直接支持这种用例。