1

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

异常不知道如何编写 org.postgresql.jdbc4.Jdbc4Array clojure.data.json/write-generic 类的 JSON

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

4

4 回答 4

2

总结一下,这对我有用,将 Jared 的答案与最新的clojure.java.jdbcAPI 更改(撰写本文时为 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.jdbcAPI 的发展而改变,但就目前而言,它是有效的。

于 2013-10-03T16:32:58.417 回答
2

最好延长IResultSetReadColumn,因为您不需要停留在范围内with-open

以下内容也更简洁:

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

确保放置它的命名空间是必需的!

于 2014-08-10T16:40:44.673 回答
1

cheshire擅长处理各种数据类型并具有可扩展性(参见 add-encoder)

于 2013-09-30T21:22:32.980 回答
1

看起来问题org.postgresql.jdbc4.Jdbc4Array没有实现java.util.CollectiongetArray在序列化之前尝试调用。

编辑:

如果它是一个嵌套结构,那么最好实现一个处理程序。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)))
于 2013-09-30T21:36:02.320 回答