2

私はjsonファイルを提供するCompojureアプリケーションに取り組んでいます。私は clojure.java.jdbc ライブラリを使用して、sqlite データベースからファイルを取得しています。

(defn grid-result [z x y]
  (j/with-connection db-specs
    (j/with-query-results results ["SELECT grid FROM grids WHERE zoom_level = ? AND tile_column = ? AND tile_row = ?" z x y]
      (doall results))))

クエリの結果は次のとおりです。

({:grid #<byte[] [B@7e88dd33>})

json として表示するために、ヘッダーを更新し、クエリ結果をバイト配列に取り除き、ByteArrayInputStream を使用します。

(defn grid-response [grid]
  {:status 200
   :headers {"Content-Type" "application/json"}
   :body (new java.io.ByteArrayInputStream (:grid (first grid)))})

リクエストの処理方法は次のとおりです。

(defroutes app-routes
  (GET "/api/:z/:x/:y.grid.json" [z x y] (grid-response (grid-result z x y))
  (route/not-found "Page not found"))

上記のすべての結果は次のとおりです。

"xœ«VJ/ÊLQ²ŠVR (éŒ1jĨ£FŒ1jĨ£FŒ1jĨÄEÊPP¨¨ªQl„
Å®€ƒQ#F5b¤«£”ZYÈ�gh`jndaXƒf†æ0†Œa¨[�7ð+k"

取得しようとしているJsonの形式は次のとおりです。

grid({"keys": ["""], "data": {"105803": {"predicti_9": 0.0257, "prediction": "3B2", "OA01CDOLD": "15UFGH0011"}, "106178": {"predicti_9": 0.0265, "prediction": "6B1", "OA01CDOLD": "15UHFE0001"}, "106171": {"predicti_9": 0.0257, "prediction": "3B2", "OA01CDOLD": "15UHFC0001"}, "105721": {"predicti_9": 0.0257, "prediction": "3B2", "OA01CDOLD": "15UFGC0013"}, "106170": {"predicti_9": 0.0257, "prediction": "3B2", "OA01CDOLD": "15UHFB0001"}}, "grid": ["  ", "  "]});

私も試したこと:

バイト配列を文字列に変換するようにグリッド応答関数を変更しました。

:body (String. (:grid (first grid)) "UTF-8")

結果は ((UTF-8 ありまたはなし):

x??VJ/?LQ??VR?(?1j??F?1j??F?1j??E?PP????Ql?
???Q#F?5b?????ZY?�gh`jndaX?f??0??a?[�7?

各 char を str にマップ:

(apply str (map #(char (bit-and % 255)) (:grid (first grid))))

結果:

xœ«VJ/ÊLQ²ŠVR (éŒ1jĨ£FŒ1jĨ£FŒ1jĨÄEÊPP¨¨ªQl„
Å®€ƒQ#F5b¤«£”ZYÈ�gh`jndaXƒf†æ0†Œa¨[�7ð+k

(ava.io.ByteArrayInputStream と同じ)。

そのバイト ストリームを json に変換する方法についてのアドバイスは大歓迎です。

4

2 に答える 2

3

グリッドは zlib で圧縮されています。だから、これは私が使用したソリューションです:

(defn zlib-decompress
  [input]
  (with-open [input (-> input io/input-stream InflaterInputStream.)]
    (slurp input)))

この関数は json の文字列表現を返すため、応答のコンテンツ タイプを「application/json」に設定すると、すべてが機能します。

于 2013-10-03T19:17:35.657 に答える