Skip to content

Use of @JsonbTypeInfo and JsonValue results in UnsupportedOperationException using arrays #665

@dansiviter

Description

@dansiviter

Describe the bug
When using a combination of @JsonbTypeInfo and JsonValue results in UnsupportedOperationException when the JsonValue resolves to an array.

To Reproduce
Run this test:

class JsonArrayTest {
  private final Jsonb jsonb = JsonbBuilder.create();

  @Test
  void deserialise() {
    var obj = jsonb.fromJson("""
      { "@type": "child", "values": [] }
      """, Parent.class);
      System.out.println(obj);
  }

  @JsonbTypeInfo(value = {
    @JsonbSubtype(alias = "child", type = Child.class)
  })
  public interface Parent {

  }
  public static record Child(JsonValue values) implements Parent { }
}

Expected behavior
It deserialises into a JsonValue.

System information:

  • OS: Windows 11 Pro
  • Java Version: openjdk version "21.0.5" 2024-10-15 LTS
  • Yasson Version: v3.0.4

Additional context

Fault is potentially with the JsonParser#getArray method not implemented in org.eclipse.yasson.internal.jsonstructure.JsonStructureToParserAdapter.

Stacktrace:

jakarta.json.bind.JsonbException: Internal error: null
 at org.eclipse.yasson.internal.DeserializationContextImpl.deserializeItem(DeserializationContextImpl.java:142)
 at org.eclipse.yasson.internal.DeserializationContextImpl.deserialize(DeserializationContextImpl.java:127)
 at org.eclipse.yasson.internal.JsonBinding.deserialize(JsonBinding.java:55)
 at org.eclipse.yasson.internal.JsonBinding.fromJson(JsonBinding.java:62)
 at com.acme.JsonArrayTest.deserialise(JsonArrayTest.java:16)
 at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
 at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
Caused by: java.lang.UnsupportedOperationException
 at jakarta.json.stream.JsonParser.getArray(JsonParser.java:419)
 at org.eclipse.yasson.internal.deserializer.types.JsonValueDeserializer.deserializeValue(JsonValueDeserializer.java:57)
 at org.eclipse.yasson.internal.deserializer.types.JsonValueDeserializer.deserialize(JsonValueDeserializer.java:40)
 at org.eclipse.yasson.internal.deserializer.types.JsonValueDeserializer.deserialize(JsonValueDeserializer.java:27)
 at org.eclipse.yasson.internal.deserializer.JsonbCreatorDeserializer.deserialize(JsonbCreatorDeserializer.java:86)
 at org.eclipse.yasson.internal.deserializer.JsonbCreatorDeserializer.deserialize(JsonbCreatorDeserializer.java:38)
 at org.eclipse.yasson.internal.deserializer.PositionChecker.deserialize(PositionChecker.java:85)
 at org.eclipse.yasson.internal.deserializer.PositionChecker.deserialize(PositionChecker.java:34)
 at org.eclipse.yasson.internal.deserializer.NullCheckDeserializer.deserialize(NullCheckDeserializer.java:46)
 at org.eclipse.yasson.internal.deserializer.NullCheckDeserializer.deserialize(NullCheckDeserializer.java:26)
 at org.eclipse.yasson.internal.deserializer.InheritanceInstanceCreator.deserialize(InheritanceInstanceCreator.java:72)
 at org.eclipse.yasson.internal.deserializer.InheritanceInstanceCreator.deserialize(InheritanceInstanceCreator.java:31)
 at org.eclipse.yasson.internal.deserializer.PositionChecker.deserialize(PositionChecker.java:85)
 at org.eclipse.yasson.internal.deserializer.PositionChecker.deserialize(PositionChecker.java:34)
 at org.eclipse.yasson.internal.deserializer.NullCheckDeserializer.deserialize(NullCheckDeserializer.java:46)
 at org.eclipse.yasson.internal.deserializer.NullCheckDeserializer.deserialize(NullCheckDeserializer.java:26)
 at org.eclipse.yasson.internal.DeserializationContextImpl.deserializeItem(DeserializationContextImpl.java:138)
 ... 72 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working right

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions