我想 jsonify 对包含 type 列的 Postgres 表执行的查询结果text[]
,但问题是它clojure.data.json.write-str
似乎不知道如何处理 PG 数组:
异常不知道如何编写 org.postgresql.jdbc4.Jdbc4Array clojure.data.json/write-generic 类的 JSON
我必须提供自定义处理程序,还是有更简单的方法?
我想 jsonify 对包含 type 列的 Postgres 表执行的查询结果text[]
,但问题是它clojure.data.json.write-str
似乎不知道如何处理 PG 数组:
异常不知道如何编写 org.postgresql.jdbc4.Jdbc4Array clojure.data.json/write-generic 类的 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 的发展而改变,但就目前而言,它是有效的。
最好延长IResultSetReadColumn
,因为您不需要停留在范围内with-open
以下内容也更简洁:
(extend-protocol jdbc/IResultSetReadColumn
org.postgresql.jdbc4.Jdbc4Array
(result-set-read-column [pgobj metadata idx]
(.getArray pgobj)))
确保放置它的命名空间是必需的!
cheshire擅长处理各种数据类型并具有可扩展性(参见 add-encoder)
看起来问题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)))