Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Clojure中转换映射的键_Clojure - Fatal编程技术网

在Clojure中转换映射的键

在Clojure中转换映射的键,clojure,Clojure,我正在使用一个REST API,该API表示具有以下JSON的帐户: { "userName": "foo", "password": "bar", "emailId": "baz" } 我有一个Clojure函数来创建一个可以这样调用的帐户: (create-account :username "foo" :password "bar" :email "baz") 我想做的是将create account所使用的漂亮键映射到restapi所期望的时髦键。我目前的解决方案是: (def cl

我正在使用一个REST API,该API表示具有以下JSON的帐户:

{ "userName": "foo", "password": "bar", "emailId": "baz" }
我有一个Clojure函数来创建一个可以这样调用的帐户:

(create-account :username "foo" :password "bar" :email "baz")
我想做的是将
create account
所使用的漂亮键映射到restapi所期望的时髦键。我目前的解决方案是:

(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

有没有更惯用的方法来实现这一点?

您可以编写一个简单的帮助函数,用给定的映射函数映射所有键:

(defn kmap [f m]
  (into {} (map #(update-in % [0] f) m)))
因此,现在您可以轻松地映射您的参数:

(def clj->rest {:username :userName
                :password :password
                :email :emailId})

(kmap clj->rest args)

看起来不错,只需将
(应用哈希映射(展平…
)更改为
(转换为{}…
)即可获得更多惯用代码

(clojure.set/rename-keys args clj->rest)
…模仿您的解决方案,生成

{:emailId "baz", :userName "foo", :password "bar"}

我想您已经找到了如何将其转换为所需的JSON。

太棒了,谢谢!是的,JSON没有问题;我可以使用
clojure.data.JSON/write str
,或者只使用clj http中的
{:form params{…}:content type:JSON}
内容。