【问题标题】:How to serialize java class to json in clojure如何在clojure中将java类序列化为json
【发布时间】:2016-12-27 05:23:02
【问题描述】:

我有很多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,但是没有成功

【问题讨论】:

    标签: java json serialization clojure


    【解决方案1】:

    谢谢大家。 clj-gson解决了问题

    【讨论】:

      【解决方案2】:

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

      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 映射,如下所示:

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

      更新

      如果您使用的是 Java bean,另请参阅:

      【讨论】:

      • @ykembayev 我不理解那些来这里提出问题并得到这样的详细答案的人,这无疑需要时间来编译,甚至懒得给答案投票。跨度>
      • @Josh 感谢您的反馈!声望低于 15 人的投票将被记录,但不会更改公开显示的帖子得分。
      【解决方案3】:

      我不确定,我正确理解了您的问题。如果您想将 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 解决
      【解决方案4】:

      使用clojure.data.json,您可以在必要时扩展编写器协议。例如:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-10
        • 2019-05-09
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多