Skip to content

Commit 94a4721

Browse files
authored
Merge pull request #84 from metosin/clojure12
fix delay serialization on clojure 1.12
2 parents 28e5e3d + 6245c6e commit 94a4721

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

project.clj

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
:dependencies [[com.fasterxml.jackson.core/jackson-core "2.17.2"]
2121
[com.fasterxml.jackson.core/jackson-databind "2.17.2"]
2222
[com.fasterxml.jackson.datatype/jackson-datatype-jsr310 "2.17.2"]]
23-
:profiles {:provided {:dependencies [[org.clojure/clojure "1.11.3"]]}
24-
:dev {:dependencies [[org.clojure/clojure "1.11.3"]
23+
:profiles {:provided {:dependencies [[org.clojure/clojure "1.12.0"]]}
24+
:dev {:dependencies [[org.clojure/clojure "1.12.0"]
2525
[jmh-clojure/jmh-clojure "0.4.1"]
2626
[com.fasterxml.jackson.datatype/jackson-datatype-joda "2.17.2"]
2727
[cheshire "5.13.0"]
@@ -34,12 +34,11 @@
3434
[com.clojure-goes-fast/clj-async-profiler "1.2.2"]
3535
[criterium "0.4.6"]]
3636
:global-vars {*warn-on-reflection* true}}
37-
:1.8 {:dependencies [[org.clojure/clojure "1.11.3"]]}
38-
:1.9 {:dependencies [[org.clojure/clojure "1.11.3"]]}
37+
:1.11 {:dependencies [[org.clojure/clojure "1.11.3"]]}
3938
:jmh {:jvm-opts ["-Dclojure.compiler.direct-linking=true"]}
4039
:perf {:jvm-opts ^:replace ["-server"
4140
"-Xmx4096m"
4241
"-Dclojure.compiler.direct-linking=true"]}}
43-
:aliases {"all" ["with-profile" "default:dev:default:dev,1.8:dev,1.9"]
42+
:aliases {"all" ["with-profile" "default:dev:default:dev,1.11"]
4443
"perf" ["with-profile" "default,dev,perf"]
4544
"repl" ["with-profile" "default,dev" "repl"]})

src/clj/jsonista/core.clj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
(:import
5151
(jsonista.jackson
5252
DateSerializer
53+
DelaySerializer
5354
FunctionalKeyDeserializer
5455
FunctionalSerializer
5556
KeywordSerializer
@@ -70,7 +71,7 @@
7071
(java.net URL)
7172
(com.fasterxml.jackson.datatype.jsr310 JavaTimeModule)
7273
(java.util Iterator List Map Date)
73-
(clojure.lang Keyword Ratio Symbol)))
74+
(clojure.lang Delay Keyword Ratio Symbol)))
7475

7576
(defn- ^Module clojure-module
7677
"Create a Jackson Databind module to support Clojure datastructures.
@@ -87,6 +88,7 @@
8788
(.addSerializer Date (if date-format
8889
(DateSerializer. date-format)
8990
(DateSerializer.)))
91+
(.addSerializer Delay (DelaySerializer.))
9092
(as-> module
9193
(doseq [[type encoder] encoders]
9294
(cond
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package jsonista.jackson;
2+
3+
import clojure.lang.Delay;
4+
import com.fasterxml.jackson.core.JsonGenerator;
5+
import com.fasterxml.jackson.databind.SerializerProvider;
6+
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
7+
8+
import java.io.IOException;
9+
10+
/** Serializer that mimics the behaviour we had prior to Clojure 1.12.
11+
The Jackson default serializer now barfs on the Delay objects after Clojure 1.12. */
12+
public class DelaySerializer extends StdSerializer<Delay> {
13+
14+
public DelaySerializer() {
15+
super(DateSerializer.class, true);
16+
}
17+
18+
@Override
19+
public void serialize(Delay value, JsonGenerator gen, SerializerProvider provider) throws IOException {
20+
gen.writeStartObject();
21+
gen.writeBooleanField("realized", value.isRealized());
22+
gen.writeEndObject();
23+
}
24+
}

test/jsonista/core_test.clj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,3 +377,15 @@
377377
(j/write-values-as-array file eduction)
378378
(is (= expected (slurp file)))
379379
(.delete file)))
380+
381+
;; clojure 1.12 seems to have changed delay so that jackson barfs on it
382+
;; this test documents the old behaviour that we preserve with our custom DelaySerializer
383+
(deftest test-delay
384+
(let [d (delay 1)
385+
d2 (delay (list :a 1))]
386+
(is (= "{\"realized\":false}" (j/write-value-as-string d)))
387+
(is (= "{\"realized\":false}" (j/write-value-as-string d2)))
388+
(force d)
389+
(force d2)
390+
(is (= "{\"realized\":true}" (j/write-value-as-string d)))
391+
(is (= "{\"realized\":true}" (j/write-value-as-string d2)))))

0 commit comments

Comments
 (0)