如何在Clojure中将Java类序列化为JSON

3

我有许多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?已经尝试使用Cheshireclojure/data.json,但都没有成功。

4个回答

3
我已经将你的示例类重新命名,使其更具体。
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))})

考虑一些示例数据(注意:构造函数细节被省略)
(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 map的返回结果。
{:name      "Joe Smith"
 :address   {:street "123 Main St" 
             :city   "Anytown"}}

更新

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


@ykembayev 我不明白为什么有些人来这里提问,得到了像这样详细的回答,明显花费了时间去整理,却连个点赞都懒得给。 - Josh
@Josh 感谢您的反馈!那些声望低于15的用户投票将被记录,但不会改变公开显示的帖子分数。 - ykembayev

2
感谢大家。问题已经通过 clj-gson 得到解决。

1
使用clojure.data.json,您可以在必要时扩展编写器协议。例如:
(require 'clojure.data.json)
(extend-type java.util.UUID
  clojure.data.json/JSONWriter
  (-write [object ^PrintWriter out]
     (.print out (str " something "))))

1

我不确定我是否正确理解了你的问题。如果你想将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"}

谢谢,我搜索了一种通用的方法来解决这个问题。通过使用clj-gson库,问题得到了解决。 - ykembayev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接