Clojure环wrap -json-params弄乱了JSON数组

时间:2012-10-31 05:05:40

标签: clojure compojure ring

我目前正在使用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中间件。

有什么想法吗?

3 个答案:

答案 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包装器,它就会弄乱数组参数