Skip to content

Commit

Permalink
Polymorphic Deduction Tests for Object vs Array (#4791)
Browse files Browse the repository at this point in the history
Tests for #4772, mark as fixed (actually fix via FasterXML/jackson-core#1356 for 2.19.0)
  • Loading branch information
Gems authored Nov 9, 2024
1 parent b63d636 commit d311e7b
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 8 deletions.
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

0 comments on commit d311e7b

Please sign in to comment.