From a475c0d526ba9b8343e28ad9543a46005b0842b3 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 4 Feb 2019 16:29:39 -0800 Subject: [PATCH] minor refactoring --- .../databind/ser/std/ToStringSerializer.java | 63 ++-------------- .../ser/std/ToStringSerializerBase.java | 74 +++++++++++++++++++ 2 files changed, 81 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase.java diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializer.java index eb7342281b..c0fff2882a 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializer.java @@ -1,27 +1,18 @@ package com.fasterxml.jackson.databind.ser.std; -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.JavaType; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; -import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; -import com.fasterxml.jackson.databind.jsontype.TypeSerializer; /** * Simple general purpose serializer, useful for any * type for which {@link Object#toString} returns the desired JSON * value. + *

+ * Since 2.10 extends {@link ToStringSerializerBase} */ @JacksonStdImpl @SuppressWarnings("serial") public class ToStringSerializer - extends StdSerializer + extends ToStringSerializerBase { /** * Singleton instance to use. @@ -39,56 +30,16 @@ public class ToStringSerializer public ToStringSerializer() { super(Object.class); } /** - * Sometimes it may actually make sense to retain actual handled type, so... + * Sometimes it may actually make sense to retain actual handled type. * * @since 2.5 */ public ToStringSerializer(Class handledType) { - super(handledType, false); - } - - @Override - public boolean isEmpty(SerializerProvider prov, Object value) { - return value.toString().isEmpty(); - } - - @Override - public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) - throws IOException - { - gen.writeString(value.toString()); - } - - /* 01-Mar-2011, tatu: We were serializing as "raw" String; but generally that - * is not what we want, since lack of type information would imply real - * String type. - */ - /** - * Default implementation will write type prefix, call regular serialization - * method (since assumption is that value itself does not need JSON - * Array or Object start/end markers), and then write type suffix. - * This should work for most cases; some sub-classes may want to - * change this behavior. - */ - @Override - public void serializeWithType(Object value, JsonGenerator g, SerializerProvider provider, - TypeSerializer typeSer) - throws IOException - { - WritableTypeId typeIdDef = typeSer.writeTypePrefix(g, - typeSer.typeId(value, JsonToken.VALUE_STRING)); - serialize(value, g, provider); - typeSer.writeTypeSuffix(g, typeIdDef); - } - - @Override - public JsonNode getSchema(SerializerProvider provider, Type typeHint) throws JsonMappingException { - return createSchemaNode("string", true); + super(handledType); } @Override - public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException - { - visitStringFormat(visitor, typeHint); + public final String valueToString(Object value) { + return value.toString(); } } diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase.java new file mode 100644 index 0000000000..7e759f6d1c --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase.java @@ -0,0 +1,74 @@ +package com.fasterxml.jackson.databind.ser.std; + +import java.io.IOException; +import java.lang.reflect.Type; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.core.type.WritableTypeId; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; + +/** + * Intermediate base class that serves as base for standard {@link ToStringSerializer} + * as well as for custom subtypes that want to add processing for converting from + * value to output into its {@code String} representation (whereas standard version + * simply calls value object's {@code toString()} method). + * + * @since 2.10 + */ +@SuppressWarnings("serial") +public abstract class ToStringSerializerBase + extends StdSerializer +{ + public ToStringSerializerBase(Class handledType) { + super(handledType, false); + } + + @Override + public boolean isEmpty(SerializerProvider prov, Object value) { + return valueToString(value).isEmpty(); + } + + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) + throws IOException + { + gen.writeString(valueToString(value)); + } + + /** + * Default implementation will write type prefix, call regular serialization + * method (since assumption is that value itself does not need JSON + * Array or Object start/end markers), and then write type suffix. + * This should work for most cases; some sub-classes may want to + * change this behavior. + */ + @Override + public void serializeWithType(Object value, JsonGenerator g, SerializerProvider provider, + TypeSerializer typeSer) + throws IOException + { + WritableTypeId typeIdDef = typeSer.writeTypePrefix(g, + typeSer.typeId(value, JsonToken.VALUE_STRING)); + serialize(value, g, provider); + typeSer.writeTypeSuffix(g, typeIdDef); + } + + @Override + public JsonNode getSchema(SerializerProvider provider, Type typeHint) throws JsonMappingException { + return createSchemaNode("string", true); + } + + @Override + public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint) throws JsonMappingException + { + visitStringFormat(visitor, typeHint); + } + + public abstract String valueToString(Object value); +}