issue-673 fix Signed-off-by: redmitry <redmitry@list.ru>
diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java b/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java index c17f6ff..36bc251 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java
@@ -1,6 +1,7 @@ /* * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. - * + * Copyright (c) 2026 Contributors to the Eclipse Foundation. + * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at * http://www.eclipse.org/legal/epl-2.0, @@ -87,6 +88,11 @@ } @Override + public Event currentEvent() { + return context.getLastValueEvent(); + } + + @Override public String getString() { return delegate.getString(); }
diff --git a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java index dfa9d64..f44999b 100644 --- a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java +++ b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java
@@ -1,5 +1,6 @@ /* * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2026 Contributors to the Eclipse Foundation. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -79,6 +80,11 @@ } @Override + public Event currentEvent() { + return iterators.peek().getValueEvent(getValue()); + } + + @Override public String getString() { return iterators.peek().getString(); } @@ -104,6 +110,11 @@ } @Override + public JsonValue getValue() { + return iterators.peek().getValue(); + } + + @Override public JsonObject getObject() { JsonStructureIterator current = iterators.peek(); if (current instanceof JsonObjectIterator) { @@ -115,6 +126,17 @@ } } + @Override + public JsonArray getArray() { + JsonStructureIterator current = iterators.peek(); + if (current instanceof JsonArrayIterator) { + iterators.pop(); + return getValue().asJsonArray(); + } else { + throw new JsonbException(Messages.getMessage(MessageKeys.INTERNAL_ERROR, "Outside of array context")); + } + } + private JsonNumber getJsonNumberValue() { JsonStructureIterator iterator = iterators.peek(); JsonValue value = iterator.getValue(); @@ -123,7 +145,7 @@ } return (JsonNumber) value; } - + @Override public JsonLocation getLocation() { throw new JsonbException("Operation not supported");
diff --git a/src/test/java/org/eclipse/yasson/jsonstructure/Issue673.java b/src/test/java/org/eclipse/yasson/jsonstructure/Issue673.java new file mode 100644 index 0000000..c7155f6 --- /dev/null +++ b/src/test/java/org/eclipse/yasson/jsonstructure/Issue673.java
@@ -0,0 +1,135 @@ +/* + * Copyright (c) 2026 Contributors to the Eclipse Foundation + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0, + * or the Eclipse Distribution License v. 1.0 which is available at + * http://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + */ + +package org.eclipse.yasson.jsonstructure; + +import jakarta.json.Json; +import jakarta.json.JsonArray; +import jakarta.json.JsonObject; +import jakarta.json.JsonString; +import jakarta.json.JsonValue; +import jakarta.json.bind.annotation.JsonbSubtype; +import jakarta.json.bind.annotation.JsonbTypeDeserializer; +import jakarta.json.bind.annotation.JsonbTypeInfo; +import jakarta.json.bind.serializer.DeserializationContext; +import jakarta.json.bind.serializer.JsonbDeserializer; +import jakarta.json.stream.JsonParser; +import java.lang.reflect.Type; +import java.util.Collections; +import java.util.stream.Collectors; + +public class Issue673 { + + public static interface Referenceable { + + } + + public static class Reference implements Referenceable { + + private String description; + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + } + + public static class IRIReference implements Referenceable { + + private String value; + + public IRIReference() {} + + public IRIReference(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + @JsonbTypeInfo(key = "type", value = { + @JsonbSubtype(alias = Location.TYPE, + type = Location.class) + }) + public static interface LocationInterface { + + } + + public static class Location implements LocationInterface { + + public final static String TYPE = "Location"; + + private String tags; + private Referenceable referenceable; + + @JsonbTypeDeserializer(TagsDeserializer.class) + public String getTags() { + return tags; + } + + public void setTags(String tags) { + this.tags = tags; + } + + @JsonbTypeDeserializer(ReferenceableDeserializer.class) + public Referenceable getReference() { + return referenceable; + } + + public void setReference(Referenceable referenceable) { + this.referenceable = referenceable; + } + } + + public static class TagsDeserializer implements JsonbDeserializer<String> { + @Override + public String deserialize(JsonParser jp, DeserializationContext dc, Type type) { + final JsonValue v = jp.getArray(); + if (v instanceof JsonArray arr) { + return arr.stream() + .filter(JsonString.class::isInstance) + .map(JsonString.class::cast) + .map(JsonString::getString) + .collect(Collectors.joining(", ")); + } + return null; + } + + } + + public static class ReferenceableDeserializer implements JsonbDeserializer<Referenceable> { + + @Override + public Referenceable deserialize(JsonParser jp, DeserializationContext dc, Type type) { + final JsonValue v = jp.getValue(); + if (v instanceof JsonString str) { + return new IRIReference(str.getString()); + } + if (v instanceof JsonObject obj) { + dc.deserialize(Reference.class, + Json.createParserFactory(Collections.EMPTY_MAP) + .createParser(obj)); + } + return null; + } + } + +}
diff --git a/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java b/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java index f6d042a..aef5fda 100644 --- a/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java +++ b/src/test/java/org/eclipse/yasson/jsonstructure/JsonStructureToParserAdapterTest.java
@@ -1,5 +1,6 @@ /* * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2026 Contributors to the Eclipse Foundation. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -23,6 +24,7 @@ import jakarta.json.JsonArrayBuilder; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; +import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; import jakarta.json.spi.JsonProvider; @@ -270,4 +272,35 @@ assertEquals("String value 1", result.getInner().getInnerFirst()); assertEquals("String value 2", result.getInner().getInnerSecond()); } + + @Test + public void testGetValue() { + final String json = + """ + { + "type": "Location", + "reference": "dummy reference" + } + """; + + Jsonb jsonb = JsonbBuilder.create( + new JsonbConfig().withDeserializers(new Issue673.ReferenceableDeserializer())); + jsonb.fromJson(json, Issue673.LocationInterface.class); + } + + @Test + public void testGetArray() { + final String json = + """ + { + "type": "Location", + "tags": ["test1", "test2"] + } + """; + + Jsonb jsonb = JsonbBuilder.create( + new JsonbConfig().withDeserializers(new Issue673.ReferenceableDeserializer())); + jsonb.fromJson(json, Issue673.LocationInterface.class); + } + }