Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java对象转换为Clojure类型_Clojure_Javabeans_Clojure Java Interop_Edn - Fatal编程技术网

将Java对象转换为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

您好,目前我正在使用java.data()将java POJO转换为与clojure兼容的类型。 它不适用于嵌套对象

例如:

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

以上所有代码都基于。享受吧