Skip to content

Commit 6bfe494

Browse files
committed
Merge branch '2.16'
2 parents ead2945 + 4432268 commit 6bfe494

File tree

3 files changed

+60
-0
lines changed

3 files changed

+60
-0
lines changed

release-notes/VERSION-2.x

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ Project: jackson-databind
6565
(fix contributed by Joo-Hyuk K)
6666
#4082: `ClassUtil` fails with `java.lang.reflect.InaccessibleObjectException`
6767
trying to setAccessible on `OptionalInt` with JDK 17+
68+
#4090: Support sequenced collections (JDK 21)S
69+
(contributed by @pjfanning)
6870

6971
2.15.3 (not yet released)
7072

src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,10 @@ protected static class ContainerDefaultMappings {
23592359
fallbacks.put(Deque.class.getName(), LinkedList.class);
23602360
fallbacks.put(NavigableSet.class.getName(), TreeSet.class);
23612361

2362+
// Sequenced types added in JDK21
2363+
fallbacks.put("java.util.SequencedCollection", DEFAULT_LIST);
2364+
fallbacks.put("java.util.SequencedSet", LinkedHashSet.class);
2365+
23622366
_collectionFallbacks = fallbacks;
23632367
}
23642368

@@ -2379,6 +2383,9 @@ protected static class ContainerDefaultMappings {
23792383
fallbacks.put(java.util.concurrent.ConcurrentNavigableMap.class.getName(),
23802384
java.util.concurrent.ConcurrentSkipListMap.class);
23812385

2386+
// Sequenced types added in JDK21
2387+
fallbacks.put("java.util.SequencedMap", LinkedHashMap.class);
2388+
23822389
_mapFallbacks = fallbacks;
23832390
}
23842391

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.fasterxml.jackson.databind.jdk21;
2+
3+
import java.util.*;
4+
5+
import com.fasterxml.jackson.databind.BaseMapTest;
6+
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.fasterxml.jackson.databind.json.JsonMapper;
8+
9+
public class Java21CollectionsTest extends BaseMapTest
10+
{
11+
// [databind#4089]
12+
record SequencedCollections(
13+
SequencedCollection<String> sequencedCollection,
14+
SequencedSet<String> sequencedSet,
15+
SequencedMap<String, Integer> sequencedMap) {
16+
}
17+
18+
public void testSequencedCollectionTypesDeserialize() throws Exception {
19+
String json = """
20+
{
21+
"sequencedCollection": ["A", "B"],
22+
"sequencedSet": ["C", "D"],
23+
"sequencedMap": {"A": 1, "B": 2}
24+
}
25+
""";
26+
27+
ObjectMapper objectMapper = JsonMapper.builder().build();
28+
SequencedCollections value = objectMapper.readValue(json, SequencedCollections.class);
29+
assertEquals(ArrayList.class, value.sequencedCollection.getClass());
30+
assertEquals(LinkedHashSet.class, value.sequencedSet.getClass());
31+
assertEquals(LinkedHashMap.class, value.sequencedMap.getClass());
32+
}
33+
34+
public void testSequencedCollectionTypesRoundTrip() throws Exception {
35+
ArrayList<String> arrayList = new ArrayList<>();
36+
arrayList.add("A");
37+
arrayList.add("B");
38+
LinkedHashSet<String> linkedHashSet = new LinkedHashSet<>();
39+
linkedHashSet.add("C");
40+
linkedHashSet.add("D");
41+
LinkedHashMap<String, Integer> linkedHashMap = new LinkedHashMap<>();
42+
linkedHashMap.put("A", 1);
43+
linkedHashMap.put("B", 2);
44+
SequencedCollections input = new SequencedCollections(arrayList, linkedHashSet, linkedHashMap);
45+
46+
ObjectMapper objectMapper = JsonMapper.builder().build();
47+
String json = objectMapper.writeValueAsString(input);
48+
SequencedCollections value = objectMapper.readValue(json, SequencedCollections.class);
49+
assertEquals(input, value);
50+
}
51+
}

0 commit comments

Comments
 (0)