I have come across a weird behavior after updating Java to version 21.
When having a record with a List field, the serialization of the object seems to behave differently.
I have made a reproducer using JBang for simplicity. For more info, see: https://www.jbang.dev/
///usr/bin/env jbang "$0" "$@" ; exit $?
//DEPS org.eclipse:yasson:3.0.4
import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;
import jakarta.json.bind.annotation.JsonbCreator;
import java.util.List;
public class RecordsWithList {
public static void main(String... args) {
// print java version
System.out.println("java.version = " + System.getProperty("java.version"));
Jsonb jsonb = JsonbBuilder.create();
String jsonString = "{\"s\":\"testParentWithList\",\"testRecords\":[{\"needed\":\"1\",\"notNeeded\":\"2\"},{\"needed\":\"3\"}]}";
ParentRecordWithList result = jsonb.fromJson(jsonString, ParentRecordWithList.class);
System.out.println("TestRecords: " + result);
}
public record ParentRecordWithList(String s,
List<TestRecord> testRecords) {
@JsonbCreator
public ParentRecordWithList {
}
}
public record TestRecord(String needed,
String notNeeded) {
@JsonbCreator
public TestRecord {
}
}
}
output for Java 17:
>jbang --java 17 --fresh RecordsWithList.java
[jbang] Resolving dependencies...
[jbang] org.eclipse:yasson:3.0.4
[jbang] Dependencies resolved
[jbang] Building jar...
java.version = 17.0.9
TestRecords: ParentRecordWithList[s=testParentWithList, testRecords=[TestRecord[needed=1, notNeeded=2], TestRecord[needed=3, notNeeded=null]]]
Output for Java 21:
>jbang --java 21 --fresh RecordsWithList.java
[jbang] Resolving dependencies...
[jbang] org.eclipse:yasson:3.0.4
[jbang] Dependencies resolved
[jbang] Building jar...
java.version = 21.0.5
TestRecords: ParentRecordWithList[s=testParentWithList, testRecords=[{needed=1, notNeeded=2}, {needed=3}]]
For some reason, the elements of testRecords seem to have map instances in Java 21.
I have come across a weird behavior after updating Java to version 21.
When having a record with a
Listfield, the serialization of the object seems to behave differently.I have made a reproducer using JBang for simplicity. For more info, see: https://www.jbang.dev/
output for Java 17:
Output for Java 21:
For some reason, the elements of
testRecordsseem to have map instances in Java 21.