在Clojure中Jsonify Jdbc4Array

时间:2013-09-30 21:08:25

标签: json postgresql clojure

我想对包含类型为text[]的列的Postgres表执行查询的结果进行jsonify,但问题是clojure.data.json.write-str似乎不知道如何处理PG数组:

  

异常不知道怎么写类org.postgresql.jdbc4.Jdbc4Array的jSON clojure.data.json / write-generic

我是否必须提供自定义处理程序,还是有更简单的方法?

4 个答案:

答案 0 :(得分:2)

总结一下,这里有什么对我有用,将Jared的答案与最新的clojure.java.jdbc API更改(撰写本文时为0.3.0-alpha5)放在一起,弃用了一些常用的模式(例如with-query-results)。

首先为您关心的每个不受支持的类型定义其他处理程序,例如:

(extend-type org.postgresql.jdbc4.Jdbc4Array
  json/JSONWriter
  (-write [o out]
    (json/-write (.getArray o) out)))

(extend-type java.sql.Timestamp
  json/JSONWriter
  (-write [date out]
    (json/-write (str date) out)))

然后在连接仍然打开时使用with-open执行JSON编码(这对于org.postgresql.jdbc4.Jdbc4Array至少很重要):

(with-open [conn (jdbc/get-connection db)]
   (json/write-str
     (jdbc/query {:connection conn}
                 ["SELECT * FROM ..."]))))

我想这会随着clojure.java.jdbc API的发展而改变,但目前它还可以。

答案 1 :(得分:2)

最好扩展IResultSetReadColumn,因为你不是 要求保持在with-open

的范围内

以下内容也更简洁:

(extend-protocol jdbc/IResultSetReadColumn
  org.postgresql.jdbc4.Jdbc4Array 
  (result-set-read-column [pgobj metadata idx]
    (.getArray pgobj)))

确保放置此名称空间的名称空间是必需的!

答案 2 :(得分:1)

cheshire非常适合处理各种数据类型并且可扩展(参见add-encoder)

答案 3 :(得分:1)

问题似乎是org.postgresql.jdbc4.Jdbc4Array没有实现java.util.Collection。在序列化之前尝试调用getArray

编辑:

如果它是嵌套结构,那么最好实现一个处理程序。 clojure.data.json使用JSONWriter协议。您可以尝试以下内容:

;; Note: Pseudo Code
(extend-type org.postgresql.jdbc4.Jdbc4Array
  clojure.data.json/JSONWriter
  (-write [o out] (clojure.data.json/-write (.getArray o) out)))