У меня есть приложение (на самом деле несколько), которое декодирует данные JSON на карте с помощью Jackson. Кажется, что данные находятся либо в Map, либо в ArrayList (в случае массивов JSON). Данные, поступающие в эти потоки, неструктурированы, поэтому они не будут меняться.
У меня есть некоторый код Clojure, который обращается к вложенным свойствам этих объектов. В идеале я хотел бы расширить ассоциативную абстракцию на эти типы Java, чтобы get-in
работал с ними. Что-то вроде следующего:
(extend-protocol clojure.lang.Associative
java.util.Map
(containsKey [this k] (.containsKey this k))
(entryAt [this k] (when (.containsKey this k)
(clojure.lang.MapEntry/create k (.get this k))))
java.util.ArrayList
(containsKey [this k] (< (.size this) k))
(entryAt [this k] (when (.containsKey this k)
(clojure.lang.MapEntry/create k (.get this k)))))
Есть две проблемы с этим; Во-первых, Associative не является протоколом (если бы он появился, он бы работал). Во-вторых, типы уже определены, поэтому я не могу добавить Associative с deftype.
Я новичок в части взаимодействия JVM с Clojure. Есть ли способ, которого я не вижу? Или есть протокол, который обертывает Associative и будет работать с get-in
, который я пропустил?
Спасибо ТАК!