Clojure 环包装json正文不是将json数据转换为关键字映射,而是转换为字符串映射

Clojure 环包装json正文不是将json数据转换为关键字映射,而是转换为字符串映射,clojure,compojure,clojure-ring,Clojure,Compojure,Clojure Ring,我在10多年前稍微涉猎过clojure之后回到了clojure,所以我可能在这里做了一些愚蠢的事情 我正试图用compojure和ring服务器编写一个简单的API,现在我已经将我的问题隔离到了几行。我有一个路由和一个处理程序,我用wrap json body包装了我的处理程序,就像ring json文档中那样 我的handler.clj如下所示: (defroutes app-routes (PUT "/item/:id" {{id :id} :params body

我在10多年前稍微涉猎过clojure之后回到了clojure,所以我可能在这里做了一些愚蠢的事情

我正试图用
compojure
ring
服务器编写一个简单的API,现在我已经将我的问题隔离到了几行。我有一个路由和一个处理程序,我用
wrap json body
包装了我的处理程序,就像
ring json
文档中那样

我的
handler.clj
如下所示:

(defroutes app-routes 
  (PUT "/item/:id" {{id :id} :params body :body} (str id ", " body))
  (route/not-found "Not Found"))

(def app
  (-> app-routes
      (middleware/wrap-json-body)
      (middleware/wrap-json-response)))
这应该足够简单,并且我能够以json OK的形式返回clojure数据。问题是当我试图读取
PUT
request body json时

$ curl -XPUT -H "Content-type: application/json" -d '{ "id": 32, "name": "pad" }' 'localhost:3001/item/5'
5, {"id" 32, "name" "pad"}
我希望
body
中填充
{:id 32:name“pad”}

以下是整个请求对象:

; (PUT "/item/:id" body (str id body))
$ curl -XPUT -H "Content-type: application/json" -d '{ "id": 32, "name": "pad" }'

{:ssl-client-cert nil, :protocol "HTTP/1.1", :remote-addr "0:0:0:0:0:0:0:1", :params {:id "5"}, :route-params {:id "5"}, :headers {"user-agent" "curl/7.58.0", "host" "localhost:3001", "accept" "*/*", "content-length" "27", "content-type" "application/json"}, :server-port 3001, :content-length 27, :compojure/route [:put "/item/:id"], :content-type "application/json", :character-encoding "UTF-8", :uri "/item/5", :server-name "localhost", :query-string nil, :body {"id" 32, "name" "pad"}, :scheme :http, :request-method :put}
我对它进行了一些调整和更改,但似乎无法用关键字ed clojure数据填充
:body

请问我做错了什么


ps:如果您想查看此问题的工作示例,我已将其上载到使用
关键字?
参数:

或者,由于ring clojure版本为0.5.1,您可以指定自定义的
键fn
来转换地图的键:

(middleware/wrap-json-body app-routes {:key-fn keyword})

见鬼去吧,这就解决了。非常感谢!我知道我错过了一些琐碎的事情。
(middleware/wrap-json-body app-routes {:key-fn keyword})