Got this far and gave up:<p><pre><code>    (let [models (-&gt;&gt; (get (clojure.data.json&#x2F;read-str json-string) &quot;models&quot;)
                      (clojure.walk&#x2F;keywordize-keys))
          fields (-&gt;&gt; models
                      (mapcat :fields)
                      (map (juxt (comp keyword :key) :name))
                      (into {}))
          entities (-&gt;&gt; models
                        (mapcat :entities)
                        (map (juxt :_id (fn [entity]
                                          (-&gt;&gt; (for [[k v] (dissoc entity :_id)]
                                                 [(get fields k) v])
                                               (into {})))))
                        (into {}))
          ]
      )
</code></pre>
Posted for posterity.