Adding separate handling for Map type, distinct from generic "JSON Object"; while JSON Schema is lame enough to not make distinction, we shouldn't be
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
index fd69104..d80eb03 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/DelegatingDeserializer.java
@@ -22,6 +22,8 @@
extends StdDeserializer<Object>
implements ContextualDeserializer, ResolvableDeserializer
{
+ private static final long serialVersionUID = 1L;
+
protected final JsonDeserializer<?> _delegatee;
/*
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
index 3d9ce46..223b242 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
@@ -13,6 +13,8 @@
public abstract class FromStringDeserializer<T>
extends StdScalarDeserializer<T>
{
+ private static final long serialVersionUID = 1L;
+
protected FromStringDeserializer(Class<?> vc) {
super(vc);
}
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
index ad990c4..e865964 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java
@@ -28,6 +28,8 @@
extends ContainerDeserializerBase<Map<Object,Object>>
implements ContextualDeserializer, ResolvableDeserializer
{
+ private static final long serialVersionUID = -3378654289961736240L;
+
// // Configuration: typing, deserializers
protected final JavaType _mapType;
diff --git a/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java b/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
index 7e4ee3c..86940c5 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java
@@ -68,6 +68,7 @@
public static class DurationDeserializer
extends FromStringDeserializer<Duration>
{
+ private static final long serialVersionUID = 1L;
public DurationDeserializer() { super(Duration.class); }
@Override
@@ -81,6 +82,7 @@
public static class GregorianCalendarDeserializer
extends StdScalarDeserializer<XMLGregorianCalendar>
{
+ private static final long serialVersionUID = 1L;
public GregorianCalendarDeserializer() { super(XMLGregorianCalendar.class); }
@Override
@@ -100,6 +102,7 @@
public static class QNameDeserializer
extends FromStringDeserializer<QName>
{
+ private static final long serialVersionUID = 1L;
public QNameDeserializer() { super(QName.class); }
@Override
diff --git a/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
index 3c85afc..206b37c 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ext/DOMDeserializer.java
@@ -18,7 +18,9 @@
*/
public abstract class DOMDeserializer<T> extends FromStringDeserializer<T>
{
- final static DocumentBuilderFactory _parserFactory;
+ private static final long serialVersionUID = 1L;
+
+ private final static DocumentBuilderFactory _parserFactory;
static {
_parserFactory = DocumentBuilderFactory.newInstance();
// yup, only cave men do XML without recognizing namespaces...
@@ -47,6 +49,7 @@
public static class NodeDeserializer extends DOMDeserializer<Node>
{
+ private static final long serialVersionUID = 1L;
public NodeDeserializer() { super(Node.class); }
@Override
public Node _deserialize(String value, DeserializationContext ctxt) throws IllegalArgumentException {
@@ -56,6 +59,7 @@
public static class DocumentDeserializer extends DOMDeserializer<Document>
{
+ private static final long serialVersionUID = 1L;
public DocumentDeserializer() { super(Document.class); }
@Override
public Document _deserialize(String value, DeserializationContext ctxt) throws IllegalArgumentException {
diff --git a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
index 22dfbec..882d40a 100644
--- a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
+++ b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonFormatVisitorWrapper.java
@@ -3,9 +3,14 @@
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonMappingException;
+/**
+ * Interface for visitor callbacks, when type in question can be any of
+ * legal JSON types.
+ */
public interface JsonFormatVisitorWrapper extends JsonFormatVisitorWithSerializerProvider
{
public JsonObjectFormatVisitor expectObjectFormat(JavaType convertedType) throws JsonMappingException;
+
public JsonArrayFormatVisitor expectArrayFormat(JavaType convertedType) throws JsonMappingException;
public JsonStringFormatVisitor expectStringFormat(JavaType convertedType) throws JsonMappingException;
public JsonNumberFormatVisitor expectNumberFormat(JavaType convertedType) throws JsonMappingException;
@@ -13,4 +18,12 @@
public JsonBooleanFormatVisitor expectBooleanFormat(JavaType convertedType) throws JsonMappingException;
public JsonNullFormatVisitor expectNullFormat(JavaType convertedType) throws JsonMappingException;
public JsonAnyFormatVisitor expectAnyFormat(JavaType convertedType) throws JsonMappingException;
+
+ /**
+ * Method called when type is of Java {@link java.util.Map} type, and will
+ * be serialized as a JSON Object.
+ *
+ * @since 2.2
+ */
+ public JsonMapFormatVisitor expectMapFormat(JavaType type) throws JsonMappingException;
}
diff --git a/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java
new file mode 100644
index 0000000..c23855e
--- /dev/null
+++ b/src/main/java/com/fasterxml/jackson/databind/jsonFormatVisitors/JsonMapFormatVisitor.java
@@ -0,0 +1,38 @@
+package com.fasterxml.jackson.databind.jsonFormatVisitors;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.SerializerProvider;
+
+public interface JsonMapFormatVisitor extends JsonFormatVisitorWithSerializerProvider
+{
+ /**
+ * Visit method called to indicate type of keys of the Map type
+ * being visited
+ */
+ public void keyFormat(JsonFormatVisitable handler, JavaType keyType) throws JsonMappingException;
+
+ /**
+ * Visit method called after {@link #keyFormat} to allow visiting of
+ * the value type
+ */
+ public void valueFormat(JsonFormatVisitable handler, JavaType valueType) throws JsonMappingException;
+
+ /**
+ * Default "empty" implementation, useful as the base to start on;
+ * especially as it is guaranteed to implement all the method
+ * of the interface, even if new methods are getting added.
+ */
+ public static class Base
+ implements JsonMapFormatVisitor
+ {
+ protected SerializerProvider provider;
+
+ public SerializerProvider getProvider() { return provider; }
+
+ public void setProvider(SerializerProvider p) { provider = p; }
+
+ public void keyFormat(JsonFormatVisitable handler, JavaType keyType) throws JsonMappingException { }
+ public void valueFormat(JsonFormatVisitable handler, JavaType valueType) throws JsonMappingException { }
+ }
+}
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 3c14995..a51aee3 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
@@ -9,7 +9,10 @@
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JacksonStdImpl;
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitable;
import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper;
+import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonMapFormatVisitor;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.ser.ContainerSerializer;
@@ -501,8 +504,16 @@
public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)
throws JsonMappingException
{
- //jackphel Aug 17 2012 : this can definitely more more exact.
- visitor.expectObjectFormat(typeHint);
+ JsonMapFormatVisitor v2 = (visitor == null) ? null : visitor.expectMapFormat(typeHint);
+ if (v2 != null) {
+ v2.keyFormat(_keySerializer, _keyType);
+ JsonSerializer<?> valueSer = _valueSerializer;
+ if (valueSer == null) {
+ valueSer = _findAndAddDynamic(_dynamicValueSerializers,
+ _valueType, visitor.getProvider());
+ }
+ v2.valueFormat(valueSer, _valueType);
+ }
}
/*
diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
index 02788c2..e629287 100644
--- a/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
+++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/ObjectArraySerializer.java
@@ -347,19 +347,18 @@
throws JsonMappingException
{
JsonArrayFormatVisitor arrayVisitor = visitor.expectArrayFormat(typeHint);
- if (arrayVisitor == null) { // not sure if this is legal but...
- return;
+ if (arrayVisitor != null) {
+ TypeFactory tf = visitor.getProvider().getTypeFactory();
+ JavaType contentType = tf.moreSpecificType(_elementType, typeHint.getContentType());
+ if (contentType == null) {
+ throw new JsonMappingException("Could not resolve type");
+ }
+ JsonSerializer<?> valueSer = _elementSerializer;
+ if (valueSer == null) {
+ valueSer = visitor.getProvider().findValueSerializer(contentType, _property);
+ }
+ arrayVisitor.itemsFormat(valueSer, contentType);
}
- TypeFactory tf = visitor.getProvider().getTypeFactory();
- JavaType contentType = tf.moreSpecificType(_elementType, typeHint.getContentType());
- if (contentType == null) {
- throw new JsonMappingException("Could not resolve type");
- }
- JsonSerializer<?> valueSer = _elementSerializer;
- if (valueSer == null) {
- valueSer = visitor.getProvider().findValueSerializer(contentType, _property);
- }
- arrayVisitor.itemsFormat(valueSer, contentType);
}
protected final JsonSerializer<Object> _findAndAddDynamic(PropertySerializerMap map,