One more fix, so that "default object typing" seems to work for basic Object.class type.
diff --git a/src/mapper/java/org/codehaus/jackson/map/ObjectMapper.java b/src/mapper/java/org/codehaus/jackson/map/ObjectMapper.java
index fb9e696..89e616e 100644
--- a/src/mapper/java/org/codehaus/jackson/map/ObjectMapper.java
+++ b/src/mapper/java/org/codehaus/jackson/map/ObjectMapper.java
@@ -623,7 +623,7 @@
public <T> T readValue(JsonParser jp, Class<T> valueType)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, TypeFactory.type(valueType), copyDeserializationConfig());
+ return (T) _readValue(copyDeserializationConfig(), jp, TypeFactory.type(valueType));
}
/**
@@ -648,7 +648,7 @@
DeserializationConfig cfg)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, TypeFactory.type(valueType), cfg);
+ return (T) _readValue(cfg, jp, TypeFactory.type(valueType));
}
/**
@@ -663,8 +663,7 @@
public <T> T readValue(JsonParser jp, TypeReference<?> valueTypeRef)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, TypeFactory.type(valueTypeRef),
- copyDeserializationConfig());
+ return (T) _readValue(copyDeserializationConfig(), jp, TypeFactory.type(valueTypeRef));
}
/**
@@ -687,7 +686,7 @@
DeserializationConfig cfg)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, TypeFactory.type(valueTypeRef), cfg);
+ return (T) _readValue(cfg, jp, TypeFactory.type(valueTypeRef));
}
/**
@@ -701,7 +700,7 @@
public <T> T readValue(JsonParser jp, JavaType valueType)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, valueType, copyDeserializationConfig());
+ return (T) _readValue(copyDeserializationConfig(), jp, valueType);
}
/**
@@ -723,7 +722,7 @@
DeserializationConfig cfg)
throws IOException, JsonParseException, JsonMappingException
{
- return (T) _readValue(jp, valueType, cfg);
+ return (T) _readValue(cfg, jp, valueType);
}
/**
@@ -762,7 +761,7 @@
* will map Json null straight into Java null. But what
* we want to return is the "null node" instead.
*/
- JsonNode n = (JsonNode) _readValue(jp, JSON_NODE_TYPE, cfg);
+ JsonNode n = (JsonNode) _readValue(cfg, jp, JSON_NODE_TYPE);
return (n == null) ? NullNode.instance : n;
}
@@ -1394,8 +1393,7 @@
/**
* Actual implementation of value reading+binding operation.
*/
- protected Object _readValue(JsonParser jp, JavaType valueType,
- DeserializationConfig cfg)
+ protected Object _readValue(DeserializationConfig cfg, JsonParser jp, JavaType valueType)
throws IOException, JsonParseException, JsonMappingException
{
/* First: may need to read the next token, to initialize
@@ -1411,7 +1409,7 @@
} else { // pointing to event other than null
DeserializationContext ctxt = _createDeserializationContext(jp, cfg);
// ok, let's get the value
- result = _findRootDeserializer(valueType).deserialize(jp, ctxt);
+ result = _findRootDeserializer(cfg, valueType).deserialize(jp, ctxt);
}
// Need to consume the token too
jp.clearCurrentToken();
@@ -1429,8 +1427,9 @@
|| t == JsonToken.END_OBJECT) {
result = null;
} else {
- DeserializationContext ctxt = _createDeserializationContext(jp, copyDeserializationConfig());
- result = _findRootDeserializer(valueType).deserialize(jp, ctxt);
+ DeserializationConfig cfg = copyDeserializationConfig();
+ DeserializationContext ctxt = _createDeserializationContext(jp, cfg);
+ result = _findRootDeserializer(cfg, valueType).deserialize(jp, ctxt);
}
// Need to consume the token too
jp.clearCurrentToken();
@@ -1487,7 +1486,7 @@
/**
* Method called to locate deserializer for the passed root-level value.
*/
- protected JsonDeserializer<Object> _findRootDeserializer(JavaType valueType)
+ protected JsonDeserializer<Object> _findRootDeserializer(DeserializationConfig cfg, JavaType valueType)
throws JsonMappingException
{
// First: have we already seen it?
@@ -1497,7 +1496,7 @@
}
// Nope: need to ask provider to resolve it
- deser = _deserializerProvider.findTypedValueDeserializer(_deserializationConfig, valueType);
+ deser = _deserializerProvider.findTypedValueDeserializer(cfg, valueType);
if (deser == null) { // can this happen?
throw new JsonMappingException("Can not find a deserializer for type "+valueType);
}
diff --git a/src/test/org/codehaus/jackson/map/jsontype/TestDefaultForObject.java b/src/test/org/codehaus/jackson/map/jsontype/TestDefaultForObject.java
new file mode 100644
index 0000000..d4bf324
--- /dev/null
+++ b/src/test/org/codehaus/jackson/map/jsontype/TestDefaultForObject.java
@@ -0,0 +1,71 @@
+package org.codehaus.jackson.map.jsontype;
+
+import java.util.*;
+
+import org.codehaus.jackson.map.*;
+
+public class TestDefaultForObject
+ extends BaseMapTest
+{
+ /*
+ ******************************************************
+ * Helper types
+ ******************************************************
+ */
+
+ static class StringBean { // ha, punny!
+ public String name;
+
+ public StringBean() { this(null); }
+ protected StringBean(String n) { name = n; }
+ }
+
+ /*
+ ******************************************************
+ * Unit tests
+ ******************************************************
+ */
+
+ public void testBeanAsObject() throws Exception
+ {
+ ObjectMapper m = new ObjectMapper();
+ m.enableDefaultTyping();
+ // note: need to wrap, to get declared as Object
+ String str = m.writeValueAsString(new Object[] { new StringBean("abc") });
+
+ verifySerializationAsMap(str);
+
+ // Ok: serialization seems to work as expected. Now deserialize:
+ //System.err.println("DEBUG: json = "+str);
+
+ Object ob = m.readValue(str, Object[].class);
+ assertNotNull(ob);
+ Object[] result = (Object[]) ob;
+ assertNotNull(result[0]);
+ assertEquals(StringBean.class, result[0].getClass());
+ assertEquals("abc", ((StringBean) result[0]).name);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void verifySerializationAsMap(String str) throws Exception
+ {
+ // First: validate that structure looks correct (as Map etc)
+ // note: should look something like:
+ // "[["org.codehaus.jackson.map.jsontype.TestDefaultForObject$StringBean",{"name":"abc"}]]")
+
+ // note: must have default mapper, default typer NOT enabled (to get 'plain' map)
+ ObjectMapper m = new ObjectMapper();
+ List<Object> list = m.readValue(str, List.class);
+ assertEquals(1, list.size()); // no type for main List, just single entry
+ Object entryOb = list.get(0);
+ assertTrue(entryOb instanceof List<?>);
+ // but then type wrapper for bean
+ List<?> entryList = (List<?>)entryOb;
+ assertEquals(2, entryList.size());
+ assertEquals(StringBean.class.getName(), entryList.get(0));
+ assertTrue(entryList.get(1) instanceof Map);
+ Map map = (Map) entryList.get(1);
+ assertEquals(1, map.size());
+ assertEquals("abc", map.get("name"));
+ }
+}