blob: 49683af858c5d8b78097cf69f73fdd122ecd6824 [file] [log] [blame]
package org.codehaus.jackson.map.jsontype;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.ObjectMapper.DefaultTyping;
public class TestDefaultForArrays extends BaseMapTest
{
/*
/**********************************************************
/* Helper types
/**********************************************************
*/
static class ArrayBean {
public Object[] values;
public ArrayBean() { this(null); }
public ArrayBean(Object[] v) { values = v; }
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
/**
* Simple unit test for verifying that we get String array
* back, even though declared type is Object array
*/
public void testArrayTypingSimple() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS);
ArrayBean bean = new ArrayBean(new String[0]);
String json = m.writeValueAsString(bean);
ArrayBean result = m.readValue(json, ArrayBean.class);
assertNotNull(result.values);
assertEquals(String[].class, result.values.getClass());
}
// And let's try it with deeper array as well
public void testArrayTypingNested() throws Exception
{
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping(DefaultTyping.NON_CONCRETE_AND_ARRAYS);
ArrayBean bean = new ArrayBean(new String[0][0]);
String json = m.writeValueAsString(bean);
ArrayBean result = m.readValue(json, ArrayBean.class);
assertNotNull(result.values);
assertEquals(String[][].class, result.values.getClass());
}
// @since 1.8
public void testNodeInArray() throws Exception
{
JsonNode node = new ObjectMapper().readTree("{\"a\":3}");
ObjectMapper m = new ObjectMapper();
m.enableDefaultTyping(DefaultTyping.JAVA_LANG_OBJECT);
Object[] obs = new Object[] { node };
String json = m.writeValueAsString(obs);
Object[] result = m.readValue(json, Object[].class);
assertEquals(1, result.length);
Object ob = result[0];
assertTrue(ob instanceof JsonNode);
}
// test for [JACKSON-845]
public void testArraysOfArrays() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
Object value = new Object[][] { new Object[] {} };
String json = mapper.writeValueAsString(value);
// try with different (but valid) nominal types:
_testArraysAs(mapper, json, Object[][].class);
_testArraysAs(mapper, json, Object[].class);
_testArraysAs(mapper, json, Object.class);
}
/*
/**********************************************************
/* Helper methods
/**********************************************************
*/
protected void _testArraysAs(ObjectMapper mapper, String json, Class<?> type)
throws Exception
{
Object o = mapper.readValue(json, type);
assertNotNull(o);
assertTrue(o instanceof Object[]);
Object[] main = (Object[]) o;
assertEquals(1, main.length);
Object element = main[0];
assertNotNull(element);
assertTrue(element instanceof Object[]);
assertEquals(0, ((Object[]) element).length);
}
}