From 3e9594b772851cde26515a07178d19a5ee47281f Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 28 Jun 2017 16:31:24 -0700 Subject: more work, convert as-array type id cases --- .../fasterxml/jackson/databind/node/ArrayNode.java | 6 ++- .../jackson/databind/node/ObjectNode.java | 7 ++- .../ser/impl/IndexedStringListSerializer.java | 6 ++- .../databind/ser/impl/MapEntrySerializer.java | 8 +-- .../ser/impl/StringCollectionSerializer.java | 6 ++- .../databind/ser/impl/UnknownSerializer.java | 6 ++- .../databind/ser/std/ArraySerializerBase.java | 15 +++--- .../databind/ser/std/AsArraySerializerBase.java | 14 +++--- .../databind/ser/std/BeanSerializerBase.java | 58 ++++++++-------------- .../jackson/databind/ser/std/MapSerializer.java | 6 ++- .../jackson/databind/node/TestConversions.java | 13 +++-- 11 files changed, 76 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/node/ArrayNode.java b/src/main/java/com/fasterxml/jackson/databind/node/ArrayNode.java index 3ff154c0d..49584c647 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/ArrayNode.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/ArrayNode.java @@ -1,6 +1,7 @@ package com.fasterxml.jackson.databind.node; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; @@ -165,11 +166,12 @@ public class ArrayNode public void serializeWithType(JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForArray(this, g); + WritableTypeId typeIdDef = new WritableTypeId(this, JsonToken.START_ARRAY); + typeSer.writeTypePrefix(g, typeIdDef); for (JsonNode n : _children) { ((BaseJsonNode)n).serialize(g, provider); } - typeSer.writeTypeSuffixForArray(this, g); + typeSer.writeTypeSuffix(g, typeIdDef); } /* diff --git a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java index 673c3321b..14b9ca054 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/ObjectNode.java @@ -1,6 +1,7 @@ package com.fasterxml.jackson.databind.node; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.util.RawValue; @@ -315,7 +316,9 @@ public class ObjectNode @SuppressWarnings("deprecation") boolean trimEmptyArray = (provider != null) && !provider.isEnabled(SerializationFeature.WRITE_EMPTY_JSON_ARRAYS); - typeSer.writeTypePrefixForObject(this, g); + + WritableTypeId typeIdDef = new WritableTypeId(this, JsonToken.START_OBJECT); + typeSer.writeTypePrefix(g, typeIdDef); for (Map.Entry en : _children.entrySet()) { BaseJsonNode value = (BaseJsonNode) en.getValue(); @@ -329,7 +332,7 @@ public class ObjectNode g.writeFieldName(en.getKey()); value.serialize(g, provider); } - typeSer.writeTypeSuffixForObject(this, g); + typeSer.writeTypeSuffix(g, typeIdDef); } /* diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedStringListSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedStringListSerializer.java index a247e4b73..6010e6bea 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedStringListSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/impl/IndexedStringListSerializer.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.*; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonArrayFormatVisitor; @@ -82,9 +83,10 @@ public final class IndexedStringListSerializer TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForArray(value, g); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_ARRAY); + typeSer.writeTypePrefix(g, typeIdDef); serializeContents(value, g, provider, value.size()); - typeSer.writeTypeSuffixForArray(value, g); + typeSer.writeTypeSuffix(g, typeIdDef); } private final void serializeContents(List value, JsonGenerator g, diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java index 55a6af78a..0386d7aa1 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/impl/MapEntrySerializer.java @@ -7,7 +7,8 @@ import java.util.Map.Entry; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; - +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; @@ -344,11 +345,12 @@ public class MapEntrySerializer public void serializeWithType(Map.Entry value, JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForObject(value, gen); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_OBJECT); // [databind#631]: Assign current value, to be accessible by custom serializers gen.setCurrentValue(value); + typeSer.writeTypePrefix(gen, typeIdDef); serializeDynamic(value, gen, provider); - typeSer.writeTypeSuffixForObject(value, gen); + typeSer.writeTypeSuffix(gen, typeIdDef); } protected void serializeDynamic(Map.Entry value, JsonGenerator gen, diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/impl/StringCollectionSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/impl/StringCollectionSerializer.java index bd6f53f94..49409606f 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/impl/StringCollectionSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/impl/StringCollectionSerializer.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.*; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonArrayFormatVisitor; @@ -85,9 +86,10 @@ public class StringCollectionSerializer TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForArray(value, g); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_ARRAY); + typeSer.writeTypePrefix(g, typeIdDef); serializeContents(value, g, provider); - typeSer.writeTypeSuffixForArray(value, g); + typeSer.writeTypeSuffix(g, typeIdDef); } private final void serializeContents(Collection value, JsonGenerator g, SerializerProvider provider) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/impl/UnknownSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/impl/UnknownSerializer.java index 841d4bc1f..01d463126 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/impl/UnknownSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/impl/UnknownSerializer.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.lang.reflect.Type; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; @@ -43,8 +44,9 @@ public class UnknownSerializer if (provider.isEnabled(SerializationFeature.FAIL_ON_EMPTY_BEANS)) { failForEmpty(provider, value); } - typeSer.writeTypePrefixForObject(value, gen); - typeSer.writeTypeSuffixForObject(value, gen); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_OBJECT); + typeSer.writeTypePrefix(gen, typeIdDef); + typeSer.writeTypeSuffix(gen, typeIdDef); } @Override diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/ArraySerializerBase.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/ArraySerializerBase.java index 349df4544..42630cd86 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/ArraySerializerBase.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/ArraySerializerBase.java @@ -4,6 +4,7 @@ import java.io.IOException; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.ser.*; @@ -125,17 +126,19 @@ public abstract class ArraySerializerBase } @Override - public final void serializeWithType(T value, JsonGenerator gen, SerializerProvider provider, + public final void serializeWithType(T value, JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForArray(value, gen); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_ARRAY); + // [databind#631]: Assign current value, to be accessible by custom serializers - gen.setCurrentValue(value); - serializeContents(value, gen, provider); - typeSer.writeTypeSuffixForArray(value, gen); + g.setCurrentValue(value); + typeSer.writeTypePrefix(g, typeIdDef); + serializeContents(value, g, provider); + typeSer.writeTypeSuffix(g, typeIdDef); } - + protected abstract void serializeContents(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException; diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/AsArraySerializerBase.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/AsArraySerializerBase.java index b6c41ee31..d34f3184f 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/AsArraySerializerBase.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/AsArraySerializerBase.java @@ -6,7 +6,7 @@ import java.lang.reflect.Type; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.core.*; - +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; @@ -251,15 +251,15 @@ public abstract class AsArraySerializerBase } @Override - public void serializeWithType(T value, JsonGenerator gen, SerializerProvider provider, + public void serializeWithType(T value, JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer) throws IOException { - // note: let's NOT consider [JACKSON-805] here; gets too complicated, and probably just won't work - typeSer.writeTypePrefixForArray(value, gen); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_ARRAY); + typeSer.writeTypePrefix(g, typeIdDef); // [databind#631]: Assign current value, to be accessible by custom serializers - gen.setCurrentValue(value); - serializeContents(value, gen, provider); - typeSer.writeTypeSuffixForArray(value, gen); + g.setCurrentValue(value); + serializeContents(value, g, provider); + typeSer.writeTypeSuffix(g, typeIdDef); } protected abstract void serializeContents(T value, JsonGenerator gen, SerializerProvider provider) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/BeanSerializerBase.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/BeanSerializerBase.java index 7bfe4b21c..e7ba76a02 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/BeanSerializerBase.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/BeanSerializerBase.java @@ -595,21 +595,7 @@ public abstract class BeanSerializerBase return; } - WritableTypeId typeIdDef; - if (_typeId == null) { - typeIdDef = new WritableTypeId(bean, JsonToken.START_OBJECT); - } else { - typeIdDef = new WritableTypeId(bean, JsonToken.START_OBJECT, - _customTypeId(bean)); - } - /* - String typeStr = (_typeId == null) ? null : _customTypeId(bean); - if (typeStr == null) { - typeSer.writeTypePrefixForObject(bean, gen); - } else { - typeSer.writeCustomTypePrefixForObject(bean, gen, typeStr); - } - */ + WritableTypeId typeIdDef = _typeIdDef(bean); gen.setCurrentValue(bean); // [databind#631] typeSer.writeTypePrefix(gen, typeIdDef); @@ -618,15 +604,7 @@ public abstract class BeanSerializerBase } else { serializeFields(bean, gen, provider); } - typeSer.writeTypeSuffix(gen, typeIdDef); - /* - if (typeStr == null) { - typeSer.writeTypeSuffixForObject(bean, gen); - } else { - typeSer.writeCustomTypeSuffixForObject(bean, gen, typeStr); - } - */ } protected final void _serializeWithObjectId(Object bean, JsonGenerator gen, SerializerProvider provider, @@ -673,7 +651,6 @@ public abstract class BeanSerializerBase w.serializer.serialize(id, gen, provider); return; } - _serializeObjectId(bean, gen, provider, typeSer, objectId); } @@ -681,25 +658,34 @@ public abstract class BeanSerializerBase TypeSerializer typeSer, WritableObjectId objectId) throws IOException { final ObjectIdWriter w = _objectIdWriter; - String typeStr = (_typeId == null) ? null :_customTypeId(bean); - if (typeStr == null) { - typeSer.writeTypePrefixForObject(bean, gen); - } else { - typeSer.writeCustomTypePrefixForObject(bean, gen, typeStr); - } + WritableTypeId typeIdDef = _typeIdDef(bean); + + typeSer.writeTypePrefix(gen, typeIdDef); objectId.writeAsField(gen, provider, w); if (_propertyFilterId != null) { serializeFieldsFiltered(bean, gen, provider); } else { serializeFields(bean, gen, provider); } - if (typeStr == null) { - typeSer.writeTypeSuffixForObject(bean, gen); - } else { - typeSer.writeCustomTypeSuffixForObject(bean, gen, typeStr); + typeSer.writeTypeSuffix(gen, typeIdDef); + } + + /** + * @since 2.9 + */ + protected final WritableTypeId _typeIdDef(Object bean) { + if (_typeId == null) { + return new WritableTypeId(bean, JsonToken.START_OBJECT); } + Object typeId = _typeId.getValue(bean); + if (typeId == null) { + // 28-Jun-2017, tatu: Is this really needed? Unchanged from 2.8 but... + typeId = ""; + } + return new WritableTypeId(bean, JsonToken.START_OBJECT, typeId); } - + + @Deprecated // since 2.9 protected final String _customTypeId(Object bean) { final Object typeId = _typeId.getValue(bean); @@ -708,7 +694,7 @@ public abstract class BeanSerializerBase } return (typeId instanceof String) ? (String) typeId : typeId.toString(); } - + /* /********************************************************** /* Field serialization methods diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java index e30987cbb..e668da573 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/MapSerializer.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; import com.fasterxml.jackson.databind.introspect.AnnotatedMember; @@ -646,9 +647,10 @@ public class MapSerializer TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForObject(value, gen); + WritableTypeId typeIdDef = new WritableTypeId(value, JsonToken.START_OBJECT); // [databind#631]: Assign current value, to be accessible by custom serializers gen.setCurrentValue(value); + typeSer.writeTypePrefix(gen, typeIdDef); if (!value.isEmpty()) { if (_sortKeys || provider.isEnabled(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS)) { value = _orderEntries(value, gen, provider); @@ -664,7 +666,7 @@ public class MapSerializer serializeFields(value, gen, provider); } } - typeSer.writeTypeSuffixForObject(value, gen); + typeSer.writeTypeSuffix(gen, typeIdDef); } /* diff --git a/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java b/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java index b17dda304..d4e3f6626 100644 --- a/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java +++ b/src/test/java/com/fasterxml/jackson/databind/node/TestConversions.java @@ -9,6 +9,7 @@ import static org.junit.Assert.*; import org.junit.Assert; import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.type.WritableTypeId; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -237,11 +238,13 @@ public class TestConversions extends BaseMapTest } @Override - public void serializeWithType(JsonGenerator jgen, - SerializerProvider provider, TypeSerializer typeSer) throws IOException { - typeSer.writeTypePrefixForObject(this, jgen); - serialize(jgen, provider); - typeSer.writeTypeSuffixForObject(this, jgen); + public void serializeWithType(JsonGenerator g, + SerializerProvider provider, TypeSerializer typeSer) throws IOException + { + WritableTypeId typeIdDef = new WritableTypeId(this, JsonToken.START_OBJECT); + typeSer.writeTypePrefix(g, typeIdDef); + serialize(g, provider); + typeSer.writeTypePrefix(g, typeIdDef); } } -- cgit v1.2.3