我的 API 正在从客户端接收一些 JSON 数据。
我想使用 Schema 对收到的数据执行验证和强制,但还有一个额外要求:如果有任何未在模式中描述的映射键,请忽略并删除它而不是验证失败(这是因为我的客户可能会向我发送一些“垃圾”属性以及我关心的属性。我想对此保持宽容。)。
所以简而言之,我想select-keys
在验证/强制之前使用我的模式对我的输入数据执行“深度”。
我需要的示例:
(require '[schema.core :as sc])
(def MySchema {:a sc/Int
:b {:c sc/Str
(sc/optional-key :d) sc/Bool}
:e [{:f sc/Inst}]})
(sanitize-and-validate
MySchema
{:a 2
:b {:c "hello"
:$$garbage-key 32}
:e [{:f #inst "2015-07-23T12:29:51.822-00:00" :garbage-key 42}]
:_garbage-key1 "woot"})
=> {:a 2
:b {:c "hello"}
:e [{:f #inst "2015-07-23T12:29:51.822-00:00"}]}
我还没有找到一种可靠的方法来做到这一点:
- 我似乎无法在自定义转换中执行此操作,因为步行者似乎无法让您访问密钥。
- 我没有运气尝试手动遍历模式,因为很难以通用方式区分映射模式和标量模式;也很难解释模式可以具有的所有可能的形状。
有没有明显的方法我没有看到?
谢谢!