1

タイプ の列を含む Postgres テーブルに対して実行されたクエリの結果を json 化したいのですtext[]が、問題はclojure.data.json.write-strPG 配列の処理方法がわからないことです。

Exception クラス org.postgresql.jdbc4.Jdbc4Array の JSON の書き方がわからない clojure.data.json/write-generic

カスタム ハンドラーを提供する必要がありますか、それとももっと簡単な方法がありますか?

4

4 に答える 4

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 に答える
2

clojure.java.jdbcまとめとして、一般的に使用されるいくつかのパターン (例: ) を非推奨にする最新の API の変更 (執筆時点では 0.3.0-alpha5)と Jared の回答をまとめて、私にとってはうまくいくものを次に示し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 に答える
1

cheshireは、さまざまなデータ型の処理と拡張性に優れています (add-encoder を参照)。

于 2013-09-30T21:22:32.980 に答える
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)))
于 2013-09-30T21:36:02.320 に答える