Clojure环包装json参数弄乱了json数组

Clojure环包装json参数弄乱了json数组,clojure,compojure,ring,Clojure,Compojure,Ring,我目前正在clojure中做一些RESTAPI的工作,我正在使用compojure中的ring.middleware.format库在clojure数据结构之间转换JSON 我有一个很大的问题,在这个问题上,发布到ring应用程序的JSON将用数组中的第一项替换所有数组。也就是说,它将从 { "buyer":"Test Name", "items":[ {"qty":1,"size":"S","product":"Red T-Shirt"}, {"

我目前正在clojure中做一些RESTAPI的工作,我正在使用compojure中的ring.middleware.format库在clojure数据结构之间转换JSON

我有一个很大的问题,在这个问题上,发布到ring应用程序的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
中间件


有什么想法吗?

我对环json参数也有类似的问题。因此,我最终使用原始请求体并自己解析JSON字符串

我使用了folliwng代码:

(defroutes app-routes
(POST "/"
    {params :body}
    (slurp params)))
我使用clj-json.core库解析json


希望这有帮助。如果你找到了更好的方法,请分享。我是Clojure/Compojure新手

我知道已经有一段时间了,但我还是偶然发现了同样的问题。我让它工作的唯一方法是在
compojure.handler/api
之前使用
ring.middleware.format/wrap restful format

我不知道为什么会这样,但如果我先放
compujure.handler/api
包装器,它会弄乱数组参数我最近遇到了这个问题,并实际解决了问题所在:在
包装json参数
中间件之后,对
包装嵌套参数
中间件进行评估,这会导致存储在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嵌套参数即可解决此问题。

谢谢!这很有效。这不是一个理想的解决方案,但它很有效。我同意这不是最好的解决办法。我已经创建了ring json params存储库,并将尝试解决这个问题。你有没有找到问题的根源?我在ring中间件格式中发现了类似的问题,并打开了一个问题: