6

所以我认为clojure.core/bean非常接近我想要的,但我正在使用具有嵌套 bean 的 Java 应用程序,因此我最终得到这样的映射:

{:month-total 3835.0 :name "Jan's Meat Diner" :owners #<BarOwner[] [Lcom.fancypants.BarOwner;@1fb332d}

如何,我如何bean递归调用 Java 对象,以便我可以让我的想象BarOwner对象也将自己作为地图发出:

{:month-total 3835.0 :name "Jan's Meat Diner" :owners { [:name "Jack"] [:name "Jill"] } }

编辑 1

我发现clojure/java.data并且from-java可能比bean.

4

2 回答 2

4

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

clojure/java.data

提供简单的递归 bean 解析,并且可以配置为专门在多毛的情况下处理 java 类型。我会向其他想要使用bean.

于 2012-10-17T18:24:17.533 回答
0

找出什么是豆,什么不是豆是非常棘手的。这似乎对作为列表的 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))
于 2012-09-29T00:02:22.837 回答