Clojure 如何将Java字符串转换为EDN对象?

Clojure 如何将Java字符串转换为EDN对象?,clojure,clojure-java-interop,edn,cheshire,Clojure,Clojure Java Interop,Edn,Cheshire,在Clojure中,我使用cheshire库的“generate string”函数将EDN转换为JSON 如果我在Clojure中使用EDN数据直接调用它,它就可以正常工作 (defn generate-json-string (generate-string {:foo "bar" :baz {:eggplant [1 2 3]} :sesion nil} {:pretty true}) ) Output => { "foo": "bar", "baz": { "

在Clojure中,我使用cheshire库的“generate string”函数将EDN转换为JSON

如果我在Clojure中使用EDN数据直接调用它,它就可以正常工作

(defn generate-json-string
  (generate-string {:foo "bar" :baz {:eggplant [1 2 3]} :sesion nil} {:pretty true})
)

Output =>
{
  "foo": "bar",
  "baz": {
    "eggplant": [1,2,3]
  },
  "sesion": null
}
但是,如果我从Java调用上述函数,并以Java字符串的形式将上述内容传递给它,它将无法工作

(defn generate-json-string [content]
  (generate-string content {:pretty true})
)

Output => 
"{:foo \"bar\" :baz {:eggplant [1 2 3]} :session nil}"

如何修复此问题?

我可以通过使用edn/read string函数解决此问题

(defn generate-json-string [content]
  (generate-string (edn/read-string content) {:pretty true})
)

下面显示了如何将数据读/写到JSON字符串或EDN字符串中

请注意,JSON和EDN都是字符串序列化格式,尽管Clojure文本数据结构通常被粗略地称为EDN的EDN数据,即使EDN在技术上意味着字符串表示

另外,请注意,这是将EDN字符串转换为Clojure数据结构的最安全的方法

(ns tst.demo.core
  (:use tupelo.core tupelo.test)
  (:require
    [clojure.tools.reader.edn :as edn]
    [tupelo.core :as t]
    [tupelo.string :as ts] ))

(def data
  "A clojure data literal"
  {:a "hello" :b {:c [1 2 3]}})

(dotest
  (let [json-str  (t/edn->json data) ; shortcut to Cheshire
        from-json (t/json->edn json-str) ; shortcut to Cheshire

        edn-str   (pr-str data) ; convert Clojure data structure => EDN string
        ; Using clojure.tools.reader.edn is the newest & safest way to
        ; read in an EDN string => data structure
        from-edn  (edn/read-string edn-str)]

    ; Convert all double-quotes to single-quotes for ease of comparison
    ; with string literal (no escapes needed)
    (is= (ts/quotes->single json-str) "{'a':'hello','b':{'c':[1,2,3]}}")
    (is= (ts/quotes->single edn-str)  "{:a 'hello', :b {:c [1 2 3]}}")

    ; If we don't convert to single quotes, we get a messier escaped
    ; string literals with escape chars '\'
    (is-nonblank= json-str "{\"a\":\"hello\",\"b\":{\"c\":[1,2,3]}}")
    (is-nonblank= edn-str   "{:a   \"hello\", :b   {:c    [1 2 3]}}")

    ; Converting either EDN or JSON string into clojure data yields the same result
    (is= data
      from-json
      from-edn)))