Skip to content

Commit d696133

Browse files
authored
Fix #167 by retaining Record field declaration order (#170)
1 parent 3b273c9 commit d696133

File tree

4 files changed

+23
-2
lines changed

4 files changed

+23
-2
lines changed

jr-objects/src/main/java/com/fasterxml/jackson/jr/ob/impl/BeanPropertyIntrospector.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,13 @@ public POJODefinition pojoDefinitionForSerialization(JSONWriter w, Class<?> pojo
4646
private POJODefinition _introspectDefinition(Class<?> beanType,
4747
boolean forSerialization, int features, boolean isRecord)
4848
{
49-
Map<String,PropBuilder> propsByName = new TreeMap<>();
49+
// 21-Oct-2024, tatu: [jackson-jr#167] Need to retain property order
50+
// for Deserialization, to keep Record properties ordered.
51+
// For Serialization OTOH we need sorting (although would probably
52+
// be better to sort after the fact, maybe in future)
53+
54+
Map<String,PropBuilder> propsByName = forSerialization ?
55+
new TreeMap<>() : new LinkedHashMap<>();
5056
_introspect(beanType, propsByName, features, isRecord);
5157

5258
final BeanConstructors constructors;
@@ -131,6 +137,10 @@ private static void _introspect(Class<?> currType, Map<String, PropBuilder> prop
131137
}
132138
if (Modifier.isPublic(f.getModifiers())) {
133139
_propFrom(props, f.getName()).withField(f);
140+
} else if (isRecord) {
141+
// 21-Oct-2024, tatu: [jackson-jr#167] Need to retain ordering of Record
142+
// properties. One way is to pre-create properties like so.
143+
_propFrom(props, f.getName());
134144
}
135145
}
136146

jr-record-test/src/test-jdk17/java/jr/failing/RecordDeser167Test.java renamed to jr-record-test/src/test-jdk17/java/jr/RecordDeser167Test.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package jr.failing;
1+
package jr;
22

33
import com.fasterxml.jackson.jr.ob.JSON;
44

release-notes/CREDITS-2.x

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,9 @@ Tomasz Gawęda (@TomaszGaweda)
6969

7070
* Contributed #162: Add support for deserializing Java Records
7171
(2.18.0)
72+
73+
Giovanni van der Schelde (@Giovds)
74+
75+
* Reported, suggested a fix for #167: Deserialization of record fails
76+
on constructor parameter ordering
77+
(2.18.1)

release-notes/VERSION-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ Modules:
1111
=== Releases ===
1212
------------------------------------------------------------------------
1313

14+
2.18.1 (not yet released)
15+
16+
#167: Deserialization of record fails on constructor parameter ordering
17+
(reported, fix suggested by Giovanni V-d-S)
18+
1419
2.18.0 (26-Sep-2024)
1520

1621
#162: Add support for deserializing Java Records

0 commit comments

Comments
 (0)