blob: c2eeb49a484f9bbaa9bb9e5fcf57c73f9dc66dcc [file] [log] [blame]
package com.fasterxml.jackson.databind.jsontype.deftyping;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping;
import com.fasterxml.jackson.databind.testutil.NoCheckSubTypeValidator;
public class TestDefaultForLists
extends BaseMapTest
{
/**
* Wrapper bean needed before there is a way to force
* type of the root value. Long is used because it is a final
* type, but not one of "untypeable" ones.
*/
static class ListOfLongs {
public List<Long> longs;
public ListOfLongs() { }
public ListOfLongs(Long ... ls) {
longs = new ArrayList<Long>();
for (Long l: ls) {
longs.add(l);
}
}
}
static class ListOfNumbers {
public List<Number> nums;
public ListOfNumbers() { }
public ListOfNumbers(Number ... numbers) {
nums = new ArrayList<Number>();
for (Number n : numbers) {
nums.add(n);
}
}
}
static class ObjectListBean {
public List<Object> values;
}
interface Foo { }
static class SetBean {
public Set<String> names;
public SetBean() { }
public SetBean(String str) {
names = new HashSet<String>();
names.add(str);
}
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
private final ObjectMapper POLY_MAPPER = jsonMapperBuilder()
.activateDefaultTyping(NoCheckSubTypeValidator.instance)
.build();
public void testListOfLongs() throws Exception
{
ListOfLongs input = new ListOfLongs(1L, 2L, 3L);
String json = POLY_MAPPER.writeValueAsString(input);
assertEquals("{\"longs\":[\"java.util.ArrayList\",[1,2,3]]}", json);
ListOfLongs output = POLY_MAPPER.readValue(json, ListOfLongs.class);
assertNotNull(output.longs);
assertEquals(3, output.longs.size());
assertEquals(Long.valueOf(1L), output.longs.get(0));
assertEquals(Long.valueOf(2L), output.longs.get(1));
assertEquals(Long.valueOf(3L), output.longs.get(2));
}
/**
* Then bit more heterogenous list; also tests mixing of
* regular scalar types, and non-typed ones (int and double
* will never have type info added; other numbers will if
* necessary)
*/
public void testListOfNumbers() throws Exception
{
ListOfNumbers input = new ListOfNumbers(Long.valueOf(1L), Integer.valueOf(2), Double.valueOf(3.0));
String json = POLY_MAPPER.writeValueAsString(input);
assertEquals("{\"nums\":[\"java.util.ArrayList\",[[\"java.lang.Long\",1],2,3.0]]}", json);
ListOfNumbers output = POLY_MAPPER.readValue(json, ListOfNumbers.class);
assertNotNull(output.nums);
assertEquals(3, output.nums.size());
assertEquals(Long.valueOf(1L), output.nums.get(0));
assertEquals(Integer.valueOf(2), output.nums.get(1));
assertEquals(Double.valueOf(3.0), output.nums.get(2));
}
public void testDateTypes() throws Exception
{
ObjectListBean input = new ObjectListBean();
List<Object> inputList = new ArrayList<Object>();
inputList.add(TimeZone.getTimeZone("EST"));
inputList.add(Locale.CHINESE);
input.values = inputList;
String json = POLY_MAPPER.writeValueAsString(input);
ObjectListBean output = POLY_MAPPER.readValue(json, ObjectListBean.class);
List<Object> outputList = output.values;
assertEquals(2, outputList.size());
assertTrue(outputList.get(0) instanceof TimeZone);
assertTrue(outputList.get(1) instanceof Locale);
}
public void testJackson628() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.activateDefaultTyping(NoCheckSubTypeValidator.instance, DefaultTyping.NON_FINAL);
ArrayList<Foo> data = new ArrayList<Foo>();
String json = mapper.writeValueAsString(data);
List<?> output = mapper.readValue(json, List.class);
assertTrue(output.isEmpty());
}
public void testJackson667() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
mapper.activateDefaultTyping(NoCheckSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.PROPERTY);
String json = mapper.writeValueAsString(new SetBean("abc"));
SetBean bean = mapper.readValue(json, SetBean.class);
assertNotNull(bean);
assertTrue(bean.names instanceof HashSet);
}
}