2016-10-03 4 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

Вместо того, чтобы обрабатывать JSON синтаксический анализ самостоятельно, вы можете использовать ring.middleware.json/wrap-json-body. Просто измените настройки промежуточного слоя:

(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 Cheshire это лучший способ для обработки 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 на синтаксис карты по умолчанию.