我目前正在使用clojure中的一些REST API,我正在使用带有compojure的ring.middleware.format库来转换来自clojure数据结构的JSON。
我遇到了一个很大的问题,因为发布到环形应用程序的JSON会将所有数组替换为数组中的第一个项目。 I.E.它将把这个JSON从
发布到它{
"buyer":"Test Name",
"items":[
{"qty":1,"size":"S","product":"Red T-Shirt"},
{"qty":1,"size":"M","product":"Green T-Shirt"}
],
"address":"123 Fake St",
"shipping":"express"
}
到这个
{
"buyer": "Test Name",
"items": {
"qty": 1,
"size": "M",
"product": "Green T-Shirt"
},
"address": "123 Fake St",
"shipping": "express"
}
它适用于任何数组,包括数组是根元素时。
我在clojure中使用以下代码来返回json:
(defroutes app-routes
(GET "/"
[]
{:body test-data})
(POST "/"
{data :params}
{:body data}))
;{:body (str "Printing " (count (data :jobs)) " jobs")}))
(def app
(-> (handler/api app-routes)
(wrap-json-params)
(wrap-json-response)))
GET路由没有正确的数组和输出问题,所以它必须是我获取数据的方式或wrap-restful-params
中间件。
有什么想法吗?
答案 0 :(得分:3)
我和ring-json-params有类似的问题。所以我最终使用了原始请求体并自己解析了JSON字符串。
我使用了以下代码:
(defroutes app-routes
(POST "/"
{params :body}
(slurp params)))
我使用clj-json.core库来解析JSON。
希望这会有所帮助。如果您想出更好的方法,请分享。我是Clojure / Compojure新手!!!
答案 1 :(得分:2)
我最近遇到了这个问题并且实际上弄清楚了问题是什么:在你的wrap-nested-params
中间件之后你得到了wrap-json-params
个中间件,这会导致存储在JSON数组/ Clojure向量中的对象通过抓住其中包含的第一个元素来展平。
user=> bod-map
{:address "100 Bush Street", :contacts [{:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}], :name "Dudely Inc.", :tax_id "5234234"}
user=> (ring.middleware.nested-params/nested-params-request {:params bod-map})
{:params {"tax_id" "5234234", "name" "Dudely Inc.", "contacts" {:name "Dudely Mcdooderson", :title "engineer", :tax_id "555"}, "address" "100 Bush Street"}}
你可以通过确保在中间件订购中首先评估wrap-nested-params来解决这个问题。
答案 2 :(得分:1)
我知道已经过了一段时间,但我偶然发现了同样的问题。我开始工作的唯一方法是使用ring.middleware.format/wrap-restful-format
之前 compojure.handler/api
。
我不确定为什么会这样,但如果我先放置compujure.handler/api
包装器,它就会弄乱数组参数