6

我目前正在 clojure 中做一些 REST API 的工作,我正在使用带有 compojure 的 ring.middleware.format 库将 JSON 转换为 clojure 数据结构和从 clojure 数据结构转换。

我遇到了一个大问题,因为发布到 ring 应用程序的 JSON 将所有数组替换为数组中的第一个项目。IE 它将把这个 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中间件。

有任何想法吗?

4

3 回答 3

3

我对 ring-json-params 有类似的问题。所以我最终使用了原始请求正文并自己解析了 JSON 字符串。

我使用了以下代码:

(defroutes app-routes
(POST "/"
    {params :body}
    (slurp params)))

我使用 clj-json.core 库来解析 JSON。

希望这可以帮助。如果您找到更好的方法,请分享。我是 Clojure/Compojure 新手!!!

于 2012-11-14T17:14:24.880 回答
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 来解决此问题。

于 2014-12-18T23:06:39.650 回答
1

我知道已经有一段时间了,但我确实偶然发现了同样的问题。我让它工作的唯一方法是ring.middleware.format/wrap-restful-format compojure.handler/api. 我不知道为什么会这样,但如果我把compujure.handler/api包装器放在第一位,它会弄乱数组参数

于 2013-09-02T20:38:39.480 回答