如何在clojure中将java类序列化为json
我有很多java类,它们可以包含另一个类如何在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
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"}