Удалить литералы #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
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