如何在使用 metosin 进行 json 解组时仅将 key-decode-fn 应用于顶级键

Raj*_*jan 0 clojure

我有一个只能解码密钥的要求。

考虑下面的例子 -

(require '[jsonista.core :as json])
(import
 (com.fasterxml.jackson.core JsonFactory$Feature)
 (com.fasterxml.jackson.databind ObjectMapper)
 (com.fasterxml.jackson.datatype.joda JodaModule))

(def s "{\"name\":\"person1\",\"book\":\"Demo Book\",\"hash\":{\"key1\":\"value1\",\"key2\":\"value2\",\"key3\":\"value3\"}}")

(def ^ObjectMapper object-mapper
  (let [obj-mapper (json/object-mapper {:decode-key-fn true :modules [(JodaModule.)]})]
    (doto obj-mapper
      (-> .getFactory (.disable JsonFactory$Feature/USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING)))
    obj-mapper))

(json/read-value s object-mapper)
Run Code Online (Sandbox Code Playgroud)

我想得到的输出是

{:book "Demo Book", :name "person1", :hash {"key3" "value3", "key2" "value2", "key1" "value1"}}
Run Code Online (Sandbox Code Playgroud)

在上面的 json 中,顶层被转换为键,嵌套不会转换为键,而是保留为字符串。

:decode-key-fn true使所有键和没有:decode-key-fn true所有键都是字符串,这不是我想要的。我怎样才能达到同样的效果?

Mar*_*ůda 5

如果您想转换所有键并且仅在顶层,您可以使用update-keys

(-> (json/read-value s object-mapper)
    (update-keys keyword))
Run Code Online (Sandbox Code Playgroud)

这样,:decode-key-fn设置object-mapperfalse.