8

リテラルを #uuid および #inst として取得する UUID と Java util date があります。リテラル自体を参照せずに uuid または日付を指定するにはどうすればよいですか? clj-json はそれらを処理するのが好きではなく、generate-string を試行するとエラーがスローされます

{:timestamp (java.util.Date.)}
;{:timestamp #inst "2013-05-17T13:45:24.095-00:00"}

;but as a string the date changes format
{:timestamp (str (java.util.Date.))}
{:timestamp "Fri May 17 09:45:44 EDT 2013"}

(json/generate-string {:uuid (java.util.UUID/randomUUID)}) 
;#uuid "d66cf77f-13b6-4291-95cd-c2bb40aa36b3"

java.lang.Exception: Cannot generate d66cf77f-13b6-4291-95cd-c2bb40aa36b3
JsonExt.java:96 clj_json.JsonExt$Generator.generate
JsonExt.java:83 clj_json.JsonExt$Generator.generate
JsonExt.java:103 clj_json.JsonExt.generate
core.clj:18 clj-json.core/generate-to-writer
core.clj:26 clj-json.core/generate-string
NO_SOURCE_FILE:32 myapp.handler/eval8390
4

4 に答える 4

5

UUID と日付をサポートするこのライブラリを使用できますhttps://github.com/dakrone/cheshire

プロジェクト ページによると、「Cheshire は、clj-json と clojure-json に基づく高速な JSON エンコーディングであり、Date/UUID/Set/Symbol エンコーディングや SMILE サポートなどの追加機能を備えています。」

于 2013-07-25T06:55:41.800 に答える
5

タイムスタンプは、「形式」を持たないオブジェクトです。自分でテキストとしてフォーマットするか、チェシャなどを使用して JSON を生成するかを選択できます。Cheshire は、JSON に適した日付形式を知っており、変換を行うことができます。

user> (def x (java.util.Date.))      
#'user/x                   ; x points to a Date object (not text)

Clojure プリンターは、バイナリー・オブジェクトを人間に表現する方法を知っています。

user> x
#inst "2015-02-13T06:24:09.629-00:00"
user> (pr-str x)
"#inst \"2015-02-13T06:24:09.629-00:00\""

テキスト表現を自分で選択できます。

user> (str x)
"Fri Feb 13 08:24:09 EET 2015"       ; default format of java.util.Date
user> (.format (java.text.SimpleDateFormat. "yyyy-MM-dd'T'HH:mm:ss.SSSXXX") x)
"2015-02-13T08:24:09.629+02:00"

区別を明確にするために、オブジェクトはロスレスのバイト値として表すこともできます。

user> (def outs (java.io.ByteArrayOutputStream.))
#'user/outs
user> (doto (java.io.ObjectOutputStream. outs) (.writeObject x) (.close))
#<ObjectOutputStream java.io.ObjectOutputStream@2bd682ed>
user> (seq (.toByteArray outs))
(-84 -19 0 5 115 114 0 14 106 97 118 97 46 117 116 105 108 46 68 97 116 101 104 106 -127 1 75 89 116 25 3 0 0 120 112 119 8 0 0 1 75 -127 -101 -39 -99 120)
于 2015-02-13T07:01:28.303 に答える