2013-09-30 3 views
1

의 Jdbc4Array 나는 유형 text[]의 열을 포함하는 포스트 그레스 테이블에 대해 수행 된 쿼리 결과를 jsonify 싶어하지만 문제는 clojure.data.json.write-str는 PG 배열을 처리하는 방법을 알고하지 않는 것이다 :Jsonify는 Clojure의

예외는 쓰기 일반적인

나는 사용자 정의 핸들러를 공급하기 위해, 또는 거기 간단합니까/클래스 org.postgresql.jdbc4.Jdbc4Array clojure.data.json의 JSON을 작성하는 방법을 몰라 방법?

답변

2

그냥 마무리하기 위해, 여기 비추천 최신 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))) 

다음 (적어도 org.postgresql.jdbc4.Jdbc4Array 중요 임) JSON 인코딩을 수행 할 with-open를 사용 :

(with-open [conn (jdbc/get-connection db)] 
    (json/write-str 
    (jdbc/query {:connection conn} 
       ["SELECT * FROM ..."])))) 

나는 이것이 clojure.java.jdbc API의 진화로 변경됩니다 생각하지만, 순간, 그것을 작동합니다. 당신이하지 다음을 따라 with-open

뭔가의 범위를 유지하기 위해 필요하기 때문에

1

cheshire는 문제가 org.postgresql.jdbc4.Jdbc4Arrayjava.util.Collection를 구현하지 않는 것입니다처럼 보이는

1

(추가 인코더 참조) 확장을 다양한 데이터 유형을 처리하고 것에 대해 좋다. serialize하기 전에 getArray으로 전화 해보십시오.

편집 :

가 중첩 된 구조 인 경우,이 핸들러를 구현하는 것이 가장 수 있습니다. clojure.data.jsonJSONWriter 프로토콜을 사용합니다. 당신은 다음과 같이 뭔가를 시도 할 수 있습니다 :

;; Note: Pseudo Code 
(extend-type org.postgresql.jdbc4.Jdbc4Array 
    clojure.data.json/JSONWriter 
    (-write [o out] (clojure.data.json/-write (.getArray o) out))) 
+0

네,하지만 하위 구조 (행 필드 중 하나)이므로 어떻게할까요? – cjauvin

+0

그러면 처리기가 가장 좋은 옵션이 될 수도 있습니다 – Jared314

+0

감사합니다. 좋은 해결책 인 것 같습니다. 불행히도 "org.postgresql.util.PSQLException :이 연결이 닫혔습니다."라는 메시지가 나타납니다. (추가적인 유용한 오류 메시지없이), 어떤 생각? – cjauvin

2

또한 IResultSetReadColumn을 확장하는 것이 더 간결하고 더 나은입니다 :이 곳

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

확실 네임 스페이스를 확인 배치가 필요합니다!