在JSON中序列化和反序列化Clojure :: namespaced-keywords

时间:2015-07-23 10:40:18

标签: json authentication serialization clojure

我正在尝试将一些Clojure数据结构序列化为持久数据库,我目前使用Chesire来实现此目的。

让我们说我有一个包含命名空间关键字的地图,如下所示:

{:cemerick.friend/identity {:current friend, :authentications {friend {:identity friend, :roles #{:clojure-cms.handler/user}}}}}

它被序列化为JSON,就像那样:

{"cemerick.friend/identity":{"current":"friend","authentications":{"friend":{"identity":"friend","roles":["clojure-cms.handler/user"]}}}}

在阅读并序列化(使用关键字化(parse-string data true))时,我会回复以下内容:

{:cemerick.friend/identity {:current friend, :authentications {:friend {:identity friend, :roles [clojure-cms.handler/user]}}}}

如何解析此JSON并获取与原始数据相同的数据?

注意this question为我要实现的目标提供了一些背景信息。

1 个答案:

答案 0 :(得分:2)

查看tests in Chesire,很明显,parse-string的可选关键字参数会影响JSON对象中的所有 name 属性,值属性类似于namespaced关键字in你的例子不受影响。实际上,你的问题是双重的:原始集合也没有正确转换回来。

对于设定问题,您可以做的是按Chesire documentation中所述编写自定义解码器。

对于原始问题,除了对返回的地图进行后期处理以外,可能没有直接的方法,找到:roles的值并将值转换为关键字,如此(未经测试):

(defn postprocess-json [authmap]
    (update-in authmap [:authentications :friend :roles] keyword))