如何递归使用clojure.core / bean?

时间:2012-09-28 20:05:36

标签: clojure

所以我认为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"] } }

编辑1

我发现clojure/java.datafrom-java可能比bean更适合这类事情。

2 个答案:

答案 0 :(得分:4)

虽然它可能不是“如何递归使用bean”的理想答案,但在Clojure社区网站下使用更多更丰富的contrib库确实解决了这个问题。具体地

clojure/java.data

提供简单的递归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))