我想对包含类型为text[]
的列的Postgres表执行查询的结果进行jsonify,但问题是clojure.data.json.write-str
似乎不知道如何处理PG数组:
异常不知道怎么写类org.postgresql.jdbc4.Jdbc4Array的jSON clojure.data.json / write-generic
我是否必须提供自定义处理程序,还是有更简单的方法?
答案 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)))