clojure – 如何在Noir中获取JSON帖子数据

不久前,Chris Granger发布了
this middleware,以便在一个伞形“骨干”元素下出现在defpage params中的JSON哈希值.

(defn backbone [handler]
  (fn [req]
    (let [neue (if (= "application/json" (get-in req [:headers "content-type"]))
       (update-in req [:params] assoc :backbone (json/parse-string (slurp (:body req)) true))
       req)]
    (handler neue))))

如何修改此代码以使JSON元素在defpage中显示为顶级参数;即摆脱:骨干伞?

最佳答案 你可以做两件事.一种选择是用解析JSON后返回的映射替换:params的值.为此,只需将新地图与:params键相关联即可.

(assoc req [:params] (json/parse-string (slurp (:body req)) true))

另一个选项(由@dAni建议)是将已解析的JSON的值合并到一起,以便不覆盖:params映射中的现有值.你需要在这里使用partial而不是仅使用merge的原因是因为最终的地图是从左到右的地图的合并结果.如果您希望JSON映射中的值优先,则您的解决方案可以正常工作.

(update-in req [:params]
  (partial merge (json/parse-string (slurp (:body req)) true)))
点赞