2016-10-03 185 views
0

在这里得到Clojure的地图是我的代码:从POST请求

(ns cowl.server 
    (:use compojure.core) 
    (:require [ring.adapter.jetty :as jetty] 
      [ring.middleware.params :as params] 
      [ring.middleware.json :refer [wrap-json-response]] 
      [ring.util.response :refer [response]] 
      [clojure.data.json :as json] 
      [cowl.db :as db])) 

(defroutes main-routes 
    (POST "/api/news/as-read" { body :body } 
    (str (json/read-str (slurp body)))))) 

(def app 
    (-> main-routes 
     wrap-json-response)) 

(defn serve [] 
    (jetty/run-jetty app {:port 3000})) 

如果我发布此JSON:{ "name": "demas" }我得到{"name" "demas"}。但这不是Clojure地图。

我需要类似(:name (json/read-str (slurp body)))。我怎么才能得到它 ?

+1

'{“name”“demas”}'确实是clojure地图。你可以拥有任何关键和价值的东西。在clojure地图中没有冒号。 – johnbakers

+0

谢谢。它帮助到我。 – demas

回答

5

您可以使用ring.middleware.json/wrap-json-body来代替自己处理正文JSON解析。只需修改您的中间件安装:

(def app 
    (-> main-routes 
     wrap-json-response 
     (wrap-json-body {:keywords? true}))) 

和您的要求:body将成为JSON解析到Clojure的数据。

1

您不妨使用keywordize-keys功能:

http://clojuredocs.org/clojure.walk/keywordize-keys

(ns xyz.core 
    (:require [clojure.walk :as walk])) 

(walk/keywordize-keys {"a" 1 "b" 2}) 
;;=> {:a 1 :b 2} 

你可能也发现,柴郡的lib是处理JSON Clojure中的最佳方式:https://github.com/dakrone/cheshire#decoding

;; parse some json 
(parse-string "{\"foo\":\"bar\"}") 
;; => {"foo" "bar"} 

;; parse some json and get keywords back 
(parse-string "{\"foo\":\"bar\"}" true) ; true -> want keyword keys 
;; => {:foo "bar"} 

;; parse some json and munge keywords with a custom function 
(parse-string "{\"foo\":\"bar\"}" (fn [k] (keyword (.toUpperCase k)))) 
;; => {:FOO "bar"} 
1

您也可以使用:key-fn功能:

(json/read-str (return :body) 
       :key-fn keyword) 

这样做,您将解析您的JSON到默认映射语法。