blob: 28930326a6e87ef365a572fa94e8282430ac2fb7 [file] [log] [blame]
package org.codehaus.jackson.map.jsontype;
import java.util.ArrayList;
import java.util.LinkedList;
import static org.junit.Assert.assertArrayEquals;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.type.TypeFactory;
import org.codehaus.jackson.type.JavaType;
public class TestTypedArrayDeserialization
extends BaseMapTest
{
/*
/**********************************************************
/* Helper types
/**********************************************************
*/
/**
* Let's claim we need type here too (although we won't
* really use any sub-classes)
*/
@SuppressWarnings("serial")
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY)
static class TypedList<T> extends ArrayList<T> { }
@SuppressWarnings("serial")
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY)
static class TypedListAsProp<T> extends ArrayList<T> { }
@SuppressWarnings("serial")
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_OBJECT)
static class TypedListAsWrapper<T> extends LinkedList<T> { }
// Mix-in to force wrapper for things like primitive arrays
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_OBJECT)
interface WrapperMixIn { }
/*
/**********************************************************
/* Unit tests, Lists
/**********************************************************
*/
public void testIntList() throws Exception
{
ObjectMapper m = new ObjectMapper();
// uses WRAPPER_OBJECT inclusion
String JSON = "{\""+TypedListAsWrapper.class.getName()+"\":[4,5, 6]}";
JavaType type = TypeFactory.defaultInstance().constructCollectionType(TypedListAsWrapper.class, Integer.class);
TypedListAsWrapper<Integer> result = m.readValue(JSON, type);
assertNotNull(result);
assertEquals(3, result.size());
assertEquals(Integer.valueOf(4), result.get(0));
assertEquals(Integer.valueOf(5), result.get(1));
assertEquals(Integer.valueOf(6), result.get(2));
}
/**
* Similar to above, but this time let's request adding type info
* as property. That would not work (since there's no JSON Object to
* add property in), so it will basically be same as using WRAPPER_ARRAY
*/
public void testBooleanListAsProp() throws Exception
{
ObjectMapper m = new ObjectMapper();
// tries to use PROPERTY inclusion; but for ARRAYS (and scalars) will become ARRAY_WRAPPER
String JSON = "[\""+TypedListAsProp.class.getName()+"\",[true, false]]";
JavaType type = TypeFactory.defaultInstance().constructCollectionType(TypedListAsProp.class, Boolean.class);
TypedListAsProp<Object> result = m.readValue(JSON, type);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(Boolean.TRUE, result.get(0));
assertEquals(Boolean.FALSE, result.get(1));
}
public void testLongListAsWrapper() throws Exception
{
ObjectMapper m = new ObjectMapper();
// uses OBJECT_ARRAY, works just fine
String JSON = "{\""+TypedListAsWrapper.class.getName()+"\":[1, 3]}";
JavaType type = TypeFactory.defaultInstance().constructCollectionType(TypedListAsWrapper.class, Long.class);
TypedListAsWrapper<Object> result = m.readValue(JSON, type);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(Long.class, result.get(0).getClass());
assertEquals(Long.valueOf(1), result.get(0));
assertEquals(Long.class, result.get(1).getClass());
assertEquals(Long.valueOf(3), result.get(1));
}
/*
/**********************************************************
/* Unit tests, primitive arrays
/**********************************************************
*/
public void testLongArray() throws Exception
{
ObjectMapper m = new ObjectMapper();
// use class name, WRAPPER_OBJECT
m.getDeserializationConfig().addMixInAnnotations(long[].class, WrapperMixIn.class);
String JSON = "{\""+long[].class.getName()+"\":[5, 6, 7]}";
long[] value = m.readValue(JSON, long[].class);
assertNotNull(value);
assertEquals(3, value.length);
assertArrayEquals(new long[] { 5L, 6L, 7L} , value);
}
}