所以我认为clojure.core/bean非常接近我想要的,但我正在使用一个嵌套bean的Java应用程序,这样我最终会得到这样的地图:
{:month-total 3835.0 :name "Jan's Meat Diner" :owners #<BarOwner[] [Lcom.fancypants.BarOwner;@1fb332d}
如何以递归方式在Java对象上调用bean
,以便我可以让我想象的BarOwner
对象自己作为地图发出:
{:month-total 3835.0 :name "Jan's Meat Diner" :owners { [:name "Jack"] [:name "Jill"] } }
我发现clojure/java.data
和from-java
可能比bean
更适合这类事情。
答案 0 :(得分:4)
虽然它可能不是“如何递归使用bean”的理想答案,但在Clojure社区网站下使用更多更丰富的contrib库确实解决了这个问题。具体地
提供简单的递归bean解析,并且可以配置为在毛茸茸的情况下专门处理java类型。我建议其他想要使用bean
的人。
答案 1 :(得分:0)
找出什么是bean而不是什么是非常棘手的。这似乎可以解决bean中的bean和列表属性的问题。您可能希望向probably-bean?
函数添加更多类,并且可能需要对映射属性的一些支持。
(defn probably-bean? [o]
(and (not (coll? o))
((complement #{Class Long String clojure.lang.Keyword}) (class o))))
(defn transf [o]
(cond
(instance? java.util.List o) (into [] (map transf o))
(probably-bean? o) (into {} (seq (bean o)))
:else o))
(defn to-bean [o]
(clojure.walk/prewalk #(transf %) o))