我想jsonify對含text[]
類型的列一個Postgres表進行查詢的結果,但問題是,clojure.data.json.write-str
似乎不知道如何處理PG陣列:Jsonify一個Jdbc4Array Clojure中
異常不知道如何寫類org.postgresql.jdbc4.Jdbc4Array clojure.data.json的JSON /寫通用
我一定要提供一個自定義的處理器,或者是有沒有更簡單辦法?
我想jsonify對含text[]
類型的列一個Postgres表進行查詢的結果,但問題是,clojure.data.json.write-str
似乎不知道如何處理PG陣列:Jsonify一個Jdbc4Array Clojure中
異常不知道如何寫類org.postgresql.jdbc4.Jdbc4Array clojure.data.json的JSON /寫通用
我一定要提供一個自定義的處理器,或者是有沒有更簡單辦法?
只是包裹起來,這裏對我來說是什麼在起作用,放在一起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的演進變化,但就目前而言,它的工作原理。
cheshire好有關處理各種數據類型,並是可延展的(見加編碼器)
它看起來像問題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)))
這是更好地延長IResultSetReadColumn
因爲你是留在with-open
東西沿着以下的範圍,不需要 也更簡潔:
(extend-protocol jdbc/IResultSetReadColumn
org.postgresql.jdbc4.Jdbc4Array
(result-set-read-column [pgobj metadata idx]
(.getArray pgobj)))
確保該命名空間在那裏,這是需要放入!
是的,但由於這是一個子結構(即行字段之一),你會怎麼做? – cjauvin
然後處理程序可能是你最好的選擇 – Jared314
謝謝,這似乎是一個很好的解決方案,不幸的是它產生「org.postgresql.util.PSQLException:此連接已關閉。」 (沒有任何額外的有用的錯誤信息),任何想法爲什麼? – cjauvin