将Java对象转换为Clojure类型
您好,目前我正在使用java.data()将java POJO转换为与clojure兼容的类型。 它不适用于嵌套对象 例如:将Java对象转换为Clojure类型,clojure,javabeans,clojure-java-interop,edn,Clojure,Javabeans,Clojure Java Interop,Edn,您好,目前我正在使用java.data()将java POJO转换为与clojure兼容的类型。 它不适用于嵌套对象 例如: class Abc { Map<String, Def> someMap; } Class Def { String b; } 但我希望输出为: { :someMap { "keyString" #object[com.sample.Def 0xb33584d "com.sam
class Abc {
Map<String, Def> someMap;
}
Class Def {
String b;
}
但我希望输出为:
{
:someMap {
"keyString" #object[com.sample.Def 0xb33584d "com.sample.Def@b33584d"]
}
}
{
:someMap {
"keyString" {
"b" "value"
}
}
}
我怎样才能解决这个问题
我尝试了clojure.corebean(),但它似乎也不起作用
提前谢谢。Clojure的内置
bean
函数只进行浅层转换——它不会递归转换任何嵌套信息。查看从Java对象到Clojure数据结构的递归转换
java.data
还支持“builder”风格的java API,因此您可以更轻松地从Clojure构建java对象。为了实现这一点,您的java对象需要符合。这意味着.getXXX()
读取对象属性(至少),以及.setXXX()
构造新对象。例如:
类内部:
package demo;
public class Inner {
public String secret;
public String getSecret() {
return secret;
}
public Inner(String arg) {
this.secret = arg;
}
}
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; }
}
类外部
:
package demo;
public class Inner {
public String secret;
public String getSecret() {
return secret;
}
public Inner(String arg) {
this.secret = arg;
}
}
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 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"}}}
原始javaobj
对Clojure来说是不透明的。使用jd/fromjava
仅使用JavaBean getter解压外层。使用jd/fromJavadeep
(注意所需的选项映射,此处留空)将根据java类对每个对象使用适当的getter递归地解压缩JavaBean
以上所有代码都基于。享受吧