Skip to content

Instantly share code, notes, and snippets.

@borkdude
Created May 19, 2021 17:20
Show Gist options
  • Save borkdude/0a99a4f413b509315d54e1c68f861fad to your computer and use it in GitHub Desktop.
Save borkdude/0a99a4f413b509315d54e1c68f861fad to your computer and use it in GitHub Desktop.
Handling arbitrary array types with transit
;; clojure -Sdeps '{:deps {com.cognitect/transit-clj {:mvn/version "RELEASE"}}}' -M /tmp/transit_arrays.clj
(require '[cognitect.transit :as transit])
(def default-write-handler
(transit/write-handler (fn [x]
(when (.isArray (class x))
"java.array"))
(fn [x]
(when (.isArray (class x))
(vec x)))))
(defn write-transit [v]
(let [baos (java.io.ByteArrayOutputStream.)]
(transit/write (transit/writer baos :json
{:default-handler default-write-handler}) v)
(.toString baos "utf-8")))
(def read-handlers
(transit/read-handler-map {"java.array" (transit/read-handler into-array)}))
(defn read-transit [s]
(let [bais (java.io.ByteArrayInputStream. (.getBytes s "UTF-8"))]
(transit/read (transit/reader bais :json
{:handlers read-handlers}))))
(def read-array (write-transit (into-array String ["foo"])))
(prn read-array)
;;=> "[\"~#java.array\",[\"foo\"]]"
(def written-array (read-transit read-array))
(prn written-array)
;; => #object["[Ljava.lang.String;" 0x58d63b16 "[Ljava.lang.String;@58d63b16"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment