2013-09-30 21 views
1

我想jsonify對含text[]類型的列一個Postgres表進行查詢的結果,但問題是,clojure.data.json.write-str似乎不知道如何處理PG陣列:Jsonify一個Jdbc4Array Clojure中

異常不知道如何寫類org.postgresql.jdbc4.Jdbc4Array clojure.data.json的JSON /寫通用

我一定要提供一個自定義的處理器,或者是有沒有更簡單辦法?

回答

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

cheshire好有關處理各種數據類型,並是可延展的(見加編碼器)

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))) 
+0

是的,但由於這是一個子結構(即行字段之一),你會怎麼做? – cjauvin

+0

然後處理程序可能是你最好的選擇 – Jared314

+0

謝謝,這似乎是一個很好的解決方案,不幸的是它產生「org.postgresql.util.PSQLException:此連接已關閉。」 (沒有任何額外的有用的錯誤信息),任何想法爲什麼? – cjauvin

2

這是更好地延長IResultSetReadColumn因爲你是留在with-open

東西沿着以下的範圍,不需要 也更簡潔:

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

確保該命名空間在那裏,這是需要放入!