我正在尝试清理Clojure中的一些JSON数据。JSON文档中的一些值被封装在带有相关(不再需要的)元数据的对象中。我从如下所示的JSON文档开始:
{ "household": {
"address": {
"street": { "value": "123 Fire Ln", "foo": "bar1" },
"zip": { "value": "01234", "foo": "bar2" }
},
"persons": [
{
"id": "0001",
"name": { "value": "John Smith", "foo": "bar3" }
},
{
"id": "0002",
"name": { "value": "Jane Smith", "foo": "bar4" }
}
]
} }使用Cheshire,我解析了这个JSON,并获得了以下数据结构:
{ "household" {
"address" {
"street" {"value" "123 Fire Ln", "foo" "bar1"},
"zip" {"value" "01234", "foo" "bar2"}
},
"persons" [
{"id" "0001", "name" {"value" "John Smith", "foo" "bar3"}}
{"id" "0002", "name" {"value" "Jane Smith", "foo" "bar4"}}
]
} }我的目标是使用" value“键”折叠“那些嵌套的map,删除"foo”assoc,并将值分配给更高一级的map key (例如,"street","zip","name")。结果数据结构将如下所示:
{ "household" {
"address" {
"street" "123 Fire Ln",
"zip" "01234"
},
"persons" [
{"id" "0001", "name" "John Smith"}
{"id" "0002", "name" "Jane Smith"}
]
} }如果能帮上忙就太好了,谢谢!
发布于 2012-03-09 06:21:34
听起来像是clojure.walk/postwalk的工作!
(defn collapse [obj]
(postwalk (fn [obj]
(or (and (map? obj)
(get obj "value"))
obj))
obj))您实际上可以大大缩短这一过程,因为get愿意处理非地图对象(它只返回nil),但我认为在第一个版本中发生的事情要清楚得多。
(defn collapse [obj]
(postwalk #(get % "value" %) obj))https://stackoverflow.com/questions/9624800
复制相似问题