我正在尝试将一些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为我要实现的目标提供了一些背景信息。
答案 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))