Конечно, (bean javaObject)
(см. bean ClojureDoc ) работает хорошо, но не позволяет выбрать свойство, которое вы хотите, и то, что вы не можете. Это оказывает влияние, когда вы вводите полученную карту в функцию json-str
, в этом случае вы можете получить сообщение об ошибке: «Не знаю, как написать JSON of ...»
И я нахожу это раздражающим, когда я имею дело с NoSQL DB (mongoDB, neo4j), который принимает, по сути, JSON (как базовый neocons ).
Так какое у меня решение?
(defmacro get-map-from-object-props [object & props]
;->> will eval and reorder the next list starting from the end
(->> (identity props) ;identity is here to return the 'props' seq
;map each property with their name as key and the java object invocation as the value
;the ~@ is here to unsplice the few properties
(map (fn [prop] [(keyword (str prop)) `(.. ~object ~@(prop-symbol prop) )]))
(into {})))
;getter is a simple function that transform a property name to its getter "name" -> "getName"
(defn prop-symbol [prop]
(map symbol (map getter (clojure.string/split (str prop) #"\\."))))
И вы можете использовать его таким образом (да, функция заботится о цепочке свойств, если таковая имеется)
(get-map-from-object-props javaObject property1 property2 property3.property1)
Надеюсь, это кому-нибудь поможет ...