Clojure 在Compojure中将字节数组转换为json

Clojure 在Compojure中将字节数组转换为json,clojure,compojure,Clojure,Compojure,我正在开发一个为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

我正在开发一个为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>})
以下是处理请求的方式:

(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"
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": ["  ", "  "]});
我也尝试过:

更改了网格响应函数以将字节数组转换为字符串: 结果((带UTF-8或不带UTF-8):

将每个字符映射到str: 结果:

"xœ«VJ/ÊLQ²ŠVR (éŒ1jĨ£FŒ1jĨ£FŒ1jĨÄEÊPP¨¨ªQl„
Å®€ƒQ#F5b¤«£”ZYÈ�gh`jndaXƒf†æ0†Œa¨[�7ð+k"
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的建议都将不胜感激。

您正在尝试读取GZIP压缩数据。您可以尝试使用以下方法:

(java.io.BufferedInputStream.
 (java.util.zip.GZIPInputStream.
  (new java.io.ByteArrayInputStream (:grid (first grid)))))

在显示之前先对其进行解压缩。

网格使用zlib进行压缩。因此,这是我使用的解决方案:

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

此函数返回json的字符串表示形式,因此当我将响应的内容类型设置为“application/json”时,一切正常。

存储时blob是什么字符串编码?blob是一个编码为UTF-8的字符串。在它上读取UTFGrid数据是gzip deflated的。因为在您的示例中,您只是将数据传递给客户端,所以您是否尝试将
内容编码
http头设置为与数据匹配(如gzip)?我尝试了gzip和deflated。它不起作用。但是如上所述使用充气输入流起作用。
(java.io.BufferedInputStream.
 (java.util.zip.GZIPInputStream.
  (new java.io.ByteArrayInputStream (:grid (first grid)))))
(defn zlib-decompress
  [input]
  (with-open [input (-> input io/input-stream InflaterInputStream.)]
    (slurp input)))