2016-12-27 16 views
1

我有很多的Java類,它可以包含其他類如何序列化的Java類JSON Clojure中

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

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

如何轉換SomeClass的Clojure中以JSON?已經嘗試使用cheshireclojure/data.json,但沒有成功

回答

1

我已經改名爲你的榜樣類,使之更加具體:

pubic class Person { 
    String name; 
    Address address; 
} 

pubic 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)) 
    }) 

考慮一些樣本數據(注:略構造細節)

(def addr-1 (Address. "123 Main St" "Anytown")) 
(def person-1 (Person. "Joe Smith" addr-1)) 

(someClass->clj person-1) ; Convert Java person-1 obj 

你會得到一個Clojure的映射回看起來如:

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

感謝,我搜索了通用的方法做 – ykembayev

+0

@ykembayev我不明白誰到這裏來的人,問的問題,並得到詳細的解答這樣這無疑需要時間來編譯和唐」我甚至懶得答覆答案。 – Josh

+0

@Josh _感謝您的反饋!投票少於15聲望的投票記錄,但不改變公開顯示的職位得分._ – ykembayev

0

我不確定,我正確理解你的問題。如果您想將java bean轉換爲clojure數據結構,則可以簡單地使用clojure bean API。使用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"} 
+0

謝謝,我搜索了通用的方法做到這一點。問題由clj-gson解決了 – ykembayev

0

隨着clojure.data.json您可以在必要時擴展寫入程序協議。例如:

(require 'clojure.data.json) 
(extend-type java.util.UUID 
    clojure.data.json/JSONWriter 
    (-write [object ^PrintWriter out] 
    (.print out (str \" object \"))))