我正在使用一个REST API,该API代表以下JSON的帐户:
{ "userName": "foo", "password": "bar", "emailId": "baz" }
我有一个clojure函数来创建一个可以这样称呼的帐户:
(create-account :username "foo" :password "bar" :email "baz")
我想做的是映射create-account
将其带到REST API期望的时髦的钥匙。我目前的解决方案是:
(def clj->rest {:username :userName
:email :emailId})
(apply hash-map
(flatten (map
(fn [[k v]] [(or (clj->rest k) k) v])
args))) ;; args is the arguments to create-account, as above
是否有一种更惯用的方法可以实现这一目标?
(clojure.set/rename-keys args clj->rest)
...模仿您的解决方案,产生...
{:emailId "baz", :userName "foo", :password "bar"}
我认为您已经完成了如何将其更改为所需的JSON。
您可以编写一个简单的助手功能来映射具有给定映射功能的所有键
(defn kmap [f m]
(into {} (map #(update-in % [0] f) m)))
所以,现在您可以轻松地映射您的参数:
(def clj->rest {:username :userName
:password :password
:email :emailId})
(kmap clj->rest args)
看起来不错,只需将 (apply hash-map (flatten ...
更改为 (into {} ...
以获取更多惯用代码。
自Clojure 1.11以来,您可以将update-keys函数用于键转换,例如:
(update-keys {"Content-Type" "text/plain"} str/lower-case)
=> {"content-type" "text/plain"}