Clojure: Как свернуть вложенные карты с определенным ключом? - PullRequest
5 голосов
/ 09 марта 2012

Я пытаюсь очистить некоторые данные JSON в Clojure. Некоторые значения в документе 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», удалить ассоциацию «foo» и назначить значение ключу карты на один уровень выше (например, «street», «zip», « название"). Результирующая структура данных будет выглядеть так:

{ "household" {
    "address" {
        "street" "123 Fire Ln",
        "zip" "01234"
    },
    "persons" [
        {"id" "0001", "name" "John Smith"}
        {"id" "0002", "name" "Jane Smith"}
    ]
} }

Любая помощь здесь была бы замечательной, спасибо!

1 Ответ

9 голосов
/ 09 марта 2012

Похоже на работу для 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...