Мой API получает некоторые данные JSON от клиента.
Я хотел бы использовать схему для выполнения проверки и принуждения к данным, которые я получаю, но с одним дополнительным требованием: если есть какой-либо ключ карты, который не описан в схеме, проигнорируйте и удалите его вместо того, чтобы не пройти проверку (это потому, что мой клиент может прислать мне несколько «мусорных» свойств вместе с теми, которые мне небезразличны. Я хочу быть терпимым к этому.).
Итак, в двух словах, я хотел бы выполнить «глубокое 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"}]}
Я еще не нашел надежного способа сделать это:
- Я не могу сделать это в пользовательском преобразовании, потому что это кажется ходок не дает вам доступа к ключам.
- Мне не удалось пройтись по схеме вручную, потому что трудно различать схемы карты и скалярные схемы общим способом; также трудно учесть все возможные формы, которые может иметь схема.
Есть ли очевидный способ, которого я не вижу?
Спасибо!