package com.fasterxml.jackson.databind.jsontype; import java.util.ArrayList; import java.util.LinkedList; import static org.junit.Assert.assertArrayEquals; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.type.TypeFactory; 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 extends ArrayList { } @SuppressWarnings("serial") @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY) static class TypedListAsProp extends ArrayList { } @SuppressWarnings("serial") @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_OBJECT) static class TypedListAsWrapper extends LinkedList { } // 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 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 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 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.addMixIn(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); } }