如何在clojure中将java类序列化为json

如何在clojure中将java类序列化为json,java,json,serialization,clojure,Java,Json,Serialization,Clojure,我有很多java类,它们可以包含另一个类 public class SomeClass(){ private String key; private String value; private AnotherClass anotherClass; } public class AnotherClass(){ private String anotherkey; private String anothervalue; } 如何在clojure中将Som

我有很多java类,它们可以包含另一个类

public class SomeClass(){
    private String key;
    private String value;
    private AnotherClass anotherClass;
}

public class AnotherClass(){
    private String anotherkey;
    private String anothervalue;
}

如何在clojure中将SomeClass转换为json?已尝试使用,但未成功

我已重命名您的示例类以使其更具体:

public class Person {
  String  name;
  Address address;
}

public class Address {
  String street;
  String city;
}
下面是一个行动纲要。您只需为每个类定义一个转换函数,然后按层次组合它们:

(defn address->clj [address]
  { :street  (.-street address)
    :city    (.-city address) } )

(defn person->clj [person]
  { :name     (.-name person)
    :address  (address->clj (.-address person)) } )
考虑一些示例数据(注:省略了构造函数细节)

您将得到一个Clojure地图,该地图如下所示:

{ :name "Joe Smith"
  :address  { :street "123 Main St" 
              :city   "Anytown" }}

更新

如果您正在使用Java bean,请参见:

  • 图书馆
  • 图书馆

    • 我不确定,我正确理解了你的问题。如果您想将JavaBean转换为clojure数据结构,只需使用clojurebeanAPI即可。使用postwalk,还可以转换所有内部零件。在下面找到一个例子

        (let [ao (doto (AnotherClass.)
                       (.setAnotherkey "Ano")
                       (.setAnothervalue "Ano-value"))
          o (doto  (SomeClass.)
                   (.setKey "A")
                   (.setValue "A-value")
                   (.setAnotherClass ao))]
         (->> (dissoc (bean o) :class)
               (w/postwalk (fn [v]
                          (if (contains? #{AnotherClass SomeClass} (type v))
                           (dissoc (bean v) :class)
                           v)))))
      
      ;;Output {:anotherClass {:anotherkey "Ano", :anothervalue "Ano-value"}, :key "A", :value "A-value"}
      

      谢谢大家。问题通过使用
      clojure.data.json

      解决,您可以在必要时扩展writer协议。例如:

      (需要“clojure.data.json”)
      (扩展类型java.util.UUID
      clojure.data.json/JSONWriter
      (-write[对象^PrintWriter输出]
      (.打印出来(str“某物”))
      
      谢谢,我搜索了通用的方法来完成它。问题由clj解决-gson@ykembayev我不理解有人来这里问问题,得到这样的详细答案,毫无疑问,这些答案需要时间来编译,甚至不用费心去更新答案。@Josh谢谢你的反馈!声誉低于15的人所投的票将被记录,但不会改变公开显示的帖子分数。
        (let [ao (doto (AnotherClass.)
                       (.setAnotherkey "Ano")
                       (.setAnothervalue "Ano-value"))
          o (doto  (SomeClass.)
                   (.setKey "A")
                   (.setValue "A-value")
                   (.setAnotherClass ao))]
         (->> (dissoc (bean o) :class)
               (w/postwalk (fn [v]
                          (if (contains? #{AnotherClass SomeClass} (type v))
                           (dissoc (bean v) :class)
                           v)))))
      
      ;;Output {:anotherClass {:anotherkey "Ano", :anothervalue "Ano-value"}, :key "A", :value "A-value"}