如何解决将Java对象转换为Clojure类型
您好,目前我正在使用java.data(https://github.com/clojure/java.data)将java pojos转换为clojure兼容类型。 它不适用于嵌套对象。
例如:
class Abc {
Map<String,Def> someMap;
}
Class Def {
String b;
}
如果我将Abc的样本实例传递给java.data,则输出为:
{
:someMap {
"keyString" #object[com.sample.Def 0xb33584d "com.sample.Def@b33584d"]
}
}
但是我希望输出为:
{
:someMap {
"keyString" {
"b" "value"
}
}
}
我该如何解决?
我尝试了clojure.core bean(https://clojuredocs.org/clojure.core/bean),但它似乎也可以正常工作。
谢谢。
解决方法
Clojure的内置bean
函数仅执行浅转换-不会递归地转换任何嵌套信息。检出https://github.com/clojure/java.data,以实现从Java对象到Clojure数据结构的递归转换(并返回)。
java.data
还支持“构建器”风格的Java API,因此您可以从Clojure轻松构建Java对象。
为使此功能正常运行,您的Java对象需要符合JavaBean specification。这意味着they need methods .getXXX()
至少要读取对象属性,还意味着.setXXX()
来构造新对象。示例:
Inner
类:
package demo;
public class Inner {
public String secret;
public String getSecret() {
return secret;
}
public Inner(String arg) {
this.secret = arg;
}
}
Outer
类:
package demo;
import java.util.HashMap;
import demo.Inner;
public class Outer {
public HashMap<String,Inner> someMap;
public Outer() {
HashMap<String,Inner> hm = new HashMap<String,Inner>();
hm.put("stuff",new Inner( "happens"));
hm.put("another",new Inner( "thing"));
this.someMap = hm;
}
public HashMap getSomeMap() { return someMap; }
}
和Clojure代码对嵌套的JavaBean对象进行解码:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test)
(:require
[clojure.java.data :as jd])
(:import [demo Calc]))
(dotest
(let [java-obj (Outer.)
obj-shallow (jd/from-java java-obj)
obj-deep (jd/from-java-deep java-obj {})]
(spyx java-obj)
(spyx obj-shallow)
(spyx-pretty obj-deep)
))
结果表明会发生什么:
--------------------------------------
Clojure 1.10.2-alpha1 Java 14
--------------------------------------
lein test tst.demo.core
java-obj => #object[demo.Outer 0x138d8219 "demo.Outer@138d8219"]
obj-shallow => {:someMap {"another" #object[demo.Inner 0x8d86c4d "demo.Inner@8d86c4d"],"stuff" #object[demo.Inner 0x28c92c51 "demo.Inner@28c92c51"]}}
obj-deep => {:someMap {"another" {:secret "thing"},"stuff" {:secret "happens"}}}
原始java-obj
对Clojure不透明。使用jd/from-java
仅使用JavaBean getter拆包外层。使用jd/from-java-deep
(注意必需的选项图,此处留空)将根据每个对象的java类,使用每个对象上的相应getter递归地解压缩JavaBean。
以上所有代码均基于this template project。享受吧!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。