Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polymorphic Deduction Tests for Object vs Array #4791

Merged
merged 6 commits into from
Nov 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions release-notes/CREDITS-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -1828,6 +1828,9 @@ Eduard Gomoliako (@Gems)
* Reported #4602: Possible wrong use of _arrayDelegateDeserializer in
BeanDeserializerBase::deserializeFromObjectUsingNonDefault()
(2.18.0)
* Reported #4772: Serialization and deserialization issue of sub-types used with
`JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array
(2.19.0)

Mathijs Vogelzang (@mathijs81)
* Reported #4678: Java records don't serialize with `MapperFeature.REQUIRE_SETTERS_FOR_GETTERS`
Expand Down
3 changes: 3 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ Project: jackson-databind
Map object is ignored when Map key type not defined
(reported by @devdanylo)
(fix by Joo-Hyuk K)
#4772: Serialization and deserialization issue of sub-types used with
`JsonTypeInfo.Id.DEDUCTION` where sub-types are Object and Array
(reported by Eduard G)
#4773: `SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS` should not apply to Maps
with uncomparable keys
(requested by @nathanukey)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.fasterxml.jackson.databind.jsontype;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;

import static org.junit.jupiter.api.Assertions.*;

public class PolymorphicDeductionObjectVsArrayTest extends DatabindTestUtil {
@JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION, defaultImpl = DataArray.class)
@JsonSubTypes({@JsonSubTypes.Type(DataObject.class), @JsonSubTypes.Type(DataArray.class)})
interface Data {
@JsonIgnore
boolean isObject();
}

static class DataItem {
final String id;

@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
DataItem(@JsonProperty("id") String id) {
this.id = id;
}

public String getId() {
return id;
}
}

static class DataObject extends DataItem implements Data {

@JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
DataObject(@JsonProperty("id") String id) {
super(id);
}

@Override
public boolean isObject() {
return true;
}
}

static class DataArray extends ArrayList<DataItem> implements Data {
private static final long serialVersionUID = 1L;

@JsonCreator
DataArray(Collection<DataItem> items) {
super(new ArrayList<>(items));
}

@Override
public boolean isObject() {
return false;
}
}

static class Container {
@JsonProperty("data")
Data data;
}

private final ObjectMapper MAPPER = newJsonMapper();

private static final String containerWithObjectData = a2q("{'data':{'id':'#1'}}");

private static final String containerWithArrayData = a2q("{'data':[{'id':'#1'}]}");

@Test
public void testDeserialization() throws Exception {
Container container = MAPPER.readValue(containerWithObjectData, Container.class);

assertInstanceOf(DataObject.class, container.data);
assertSame(container.data.getClass(), DataObject.class);
assertTrue(container.data.isObject());
assertEquals("#1", ((DataItem) container.data).id);

container = MAPPER.readValue(containerWithArrayData, Container.class);
assertInstanceOf(DataArray.class, container.data);
assertEquals(container.data.getClass(), DataArray.class);
assertFalse(container.data.isObject());

@SuppressWarnings("unchecked")
Iterator<DataItem> arrayDataIterator = ((Iterable<DataItem>) container.data).iterator();

assertTrue(arrayDataIterator.hasNext());
assertEquals("#1", arrayDataIterator.next().id);
}

@Test
public void testSerialization() throws Exception {
Container container = new Container();
container.data = new DataObject("#1");
String json = MAPPER.writeValueAsString(container);
assertEquals(containerWithObjectData, json);

container = new Container();
container.data = new DataArray(Arrays.asList(new DataItem("#1")));
json = MAPPER.writeValueAsString(container);
assertEquals(containerWithArrayData, json);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.jackson.databind.type.TypeFactory;

import static org.junit.jupiter.api.Assertions.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,11 @@
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonValue;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.exc.InvalidDefinitionException;
import com.fasterxml.jackson.databind.exc.InvalidTypeIdException;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.jackson.databind.type.TypeFactory;

import static org.junit.jupiter.api.Assertions.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsontype.impl.StdSubtypeResolver;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.jackson.databind.type.TypeFactory;

import static org.junit.jupiter.api.Assertions.*;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import com.fasterxml.jackson.databind.type.TypeFactory;

import static org.junit.jupiter.api.Assertions.*;

Expand Down