【发布时间】:2017-08-30 00:32:59
【问题描述】:
我有一个应用程序(实际上是几个),它使用 Jackson 解码 Map 中的 JSON 数据。数据似乎在 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 不是协议(如果是这样的话,它会起作用)。第二个是类型已经定义,所以我不能用 deftype 添加 Associative。
我对 Clojure 的 JVM 互操作部分还很陌生。有没有我没看到的方法?或者是否有一个协议可以包装 Associative 并且可以与我错过的 get-in 一起使用?
谢谢!
【问题讨论】:
标签: clojure clojure-java-interop