Удалить литералы #inst и #uuid в clojure



У меня есть UUID и дата Java util, которые получают литералы как #uuid и #inst, как я могу указать 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
626   4  

4 ответов:

Не уверен, но похоже, что вам нужно:

user=> (str (java.util.UUID/randomUUID))
"91d7fcc5-d24d-4e33-a111-6ba69d14eb6a"

Для даты вам нужно выбрать правильный формат. То есть:

user=> (import java.text.SimpleDateFormat)
java.text.SimpleDateFormat
user=> (.format (SimpleDateFormat. "yyyy/MM/dd HH:mm:ss") (java.util.Date.))
"2013/05/17 16:49:58"

Вы можете использовать эту библиотеку, которая поддерживает UUID и даты https://github.com/dakrone/cheshire

Согласно странице проекта " Cheshire-это быстрое кодирование JSON, основанное на clj-json и clojure-json, с дополнительными функциями, такими как кодирование даты/UUID/Set/Symbol и поддержка улыбки."

Метка времени-это объект, который не имеет "формата". Вы можете сами форматировать is как текст или использовать, например, cheshire для генерации JSON. Чешир знает, какой формат даты хорошо сочетается с 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)

Что касается даты и времени, вам лучше просто использовать clj-time, который является оболочкой вокруг библиотек времени joda. Это позволяет избежать необходимости иметь дело с отвратительной датой java, календарем времени, форматом.

Я также недавно видел библиотеку clj-uuid на github, которая могла бы сделать работу с uuids немного более clojurish

Comments

    Ничего не найдено.