如何将 Java 字符串转换为 EDN 对象?
How to convert Java String to EDN object?
在 Clojure 中,我使用柴郡 (https://github.com/dakrone/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})
)
下面显示了如何将数据 read/write 转换为 JSON 字符串或 EDN 字符串。
请注意,JSON 和 EDN 都是字符串序列化格式,尽管 Clojure 文字数据结构通常(草率地)被称为 "EDN data" 而只是 "EDN",尽管从技术上讲 EDN表示字符串表示。
另请注意,clojure.tools.reader.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)))
在 Clojure 中,我使用柴郡 (https://github.com/dakrone/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})
)
下面显示了如何将数据 read/write 转换为 JSON 字符串或 EDN 字符串。
请注意,JSON 和 EDN 都是字符串序列化格式,尽管 Clojure 文字数据结构通常(草率地)被称为 "EDN data" 而只是 "EDN",尽管从技术上讲 EDN表示字符串表示。
另请注意,clojure.tools.reader.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)))