package com.fasterxml.jackson.databind.jsontype; import java.util.*; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.BaseMapTest; import com.fasterxml.jackson.databind.ObjectMapper; /** * Testing to verify that {@link JsonTypeInfo} works * for properties as well as types. */ @SuppressWarnings("serial") public class TestPropertyTypeInfo extends BaseMapTest { protected static class BooleanValue { public Boolean b; @JsonCreator public BooleanValue(Boolean value) { b = value; } @JsonValue public Boolean value() { return b; } } static class FieldWrapperBean { @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public Object value; public FieldWrapperBean() { } public FieldWrapperBean(Object o) { value = o; } } static class FieldWrapperBeanList extends ArrayList { } static class FieldWrapperBeanMap extends HashMap { } static class FieldWrapperBeanArray { @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public FieldWrapperBean[] beans; public FieldWrapperBeanArray() { } public FieldWrapperBeanArray(FieldWrapperBean[] beans) { this.beans = beans; } } static class MethodWrapperBean { protected Object value; @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public Object getValue() { return value; } @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public void setValue(Object v) { value = v; } public MethodWrapperBean() { } public MethodWrapperBean(Object o) { value = o; } } static class MethodWrapperBeanList extends ArrayList { } static class MethodWrapperBeanMap extends HashMap { } static class MethodWrapperBeanArray { protected MethodWrapperBean[] beans; @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public MethodWrapperBean[] getValue() { return beans; } @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.WRAPPER_ARRAY) public void setValue(MethodWrapperBean[] v) { beans = v; } public MethodWrapperBeanArray() { } public MethodWrapperBeanArray(MethodWrapperBean[] beans) { this.beans = beans; } } static class OtherBean { public int x = 1, y = 1; } /* /********************************************************** /* Unit tests /********************************************************** */ public void testSimpleField() throws Exception { ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(new FieldWrapperBean(new StringWrapper("foo"))); //System.out.println("JSON/field+object == "+json); FieldWrapperBean bean = mapper.readValue(json, FieldWrapperBean.class); assertNotNull(bean.value); assertEquals(StringWrapper.class, bean.value.getClass()); assertEquals(((StringWrapper) bean.value).str, "foo"); } public void testSimpleMethod() throws Exception { ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(new FieldWrapperBean(new IntWrapper(37))); //System.out.println("JSON/method+object == "+json); FieldWrapperBean bean = mapper.readValue(json, FieldWrapperBean.class); assertNotNull(bean.value); assertEquals(IntWrapper.class, bean.value.getClass()); assertEquals(((IntWrapper) bean.value).i, 37); } public void testSimpleListField() throws Exception { ObjectMapper mapper = new ObjectMapper(); FieldWrapperBeanList list = new FieldWrapperBeanList(); list.add(new FieldWrapperBean(new OtherBean())); String json = mapper.writeValueAsString(list); //System.out.println("JSON/field+list == "+json); FieldWrapperBeanList result = mapper.readValue(json, FieldWrapperBeanList.class); assertNotNull(result); assertEquals(1, result.size()); FieldWrapperBean bean = list.get(0); assertEquals(OtherBean.class, bean.value.getClass()); assertEquals(((OtherBean) bean.value).x, 1); assertEquals(((OtherBean) bean.value).y, 1); } public void testSimpleListMethod() throws Exception { ObjectMapper mapper = new ObjectMapper(); MethodWrapperBeanList list = new MethodWrapperBeanList(); list.add(new MethodWrapperBean(new BooleanValue(true))); list.add(new MethodWrapperBean(new StringWrapper("x"))); list.add(new MethodWrapperBean(new OtherBean())); String json = mapper.writeValueAsString(list); MethodWrapperBeanList result = mapper.readValue(json, MethodWrapperBeanList.class); assertNotNull(result); assertEquals(3, result.size()); MethodWrapperBean bean = result.get(0); assertEquals(BooleanValue.class, bean.value.getClass()); assertEquals(((BooleanValue) bean.value).b, Boolean.TRUE); bean = result.get(1); assertEquals(StringWrapper.class, bean.value.getClass()); assertEquals(((StringWrapper) bean.value).str, "x"); bean = result.get(2); assertEquals(OtherBean.class, bean.value.getClass()); } public void testSimpleArrayField() throws Exception { ObjectMapper mapper = new ObjectMapper(); FieldWrapperBeanArray array = new FieldWrapperBeanArray(new FieldWrapperBean[] { new FieldWrapperBean(new BooleanValue(true)) }); String json = mapper.writeValueAsString(array); FieldWrapperBeanArray result = mapper.readValue(json, FieldWrapperBeanArray.class); assertNotNull(result); FieldWrapperBean[] beans = result.beans; assertEquals(1, beans.length); FieldWrapperBean bean = beans[0]; assertEquals(BooleanValue.class, bean.value.getClass()); assertEquals(((BooleanValue) bean.value).b, Boolean.TRUE); } public void testSimpleArrayMethod() throws Exception { ObjectMapper mapper = new ObjectMapper(); MethodWrapperBeanArray array = new MethodWrapperBeanArray(new MethodWrapperBean[] { new MethodWrapperBean(new StringWrapper("A")) }); String json = mapper.writeValueAsString(array); MethodWrapperBeanArray result = mapper.readValue(json, MethodWrapperBeanArray.class); assertNotNull(result); MethodWrapperBean[] beans = result.beans; assertEquals(1, beans.length); MethodWrapperBean bean = beans[0]; assertEquals(StringWrapper.class, bean.value.getClass()); assertEquals(((StringWrapper) bean.value).str, "A"); } public void testSimpleMapField() throws Exception { ObjectMapper mapper = new ObjectMapper(); FieldWrapperBeanMap map = new FieldWrapperBeanMap(); map.put("foop", new FieldWrapperBean(new IntWrapper(13))); String json = mapper.writeValueAsString(map); FieldWrapperBeanMap result = mapper.readValue(json, FieldWrapperBeanMap.class); assertNotNull(result); assertEquals(1, result.size()); FieldWrapperBean bean = result.get("foop"); assertNotNull(bean); Object ob = bean.value; assertEquals(IntWrapper.class, ob.getClass()); assertEquals(((IntWrapper) ob).i, 13); } public void testSimpleMapMethod() throws Exception { ObjectMapper mapper = new ObjectMapper(); MethodWrapperBeanMap map = new MethodWrapperBeanMap(); map.put("xyz", new MethodWrapperBean(new BooleanValue(true))); String json = mapper.writeValueAsString(map); MethodWrapperBeanMap result = mapper.readValue(json, MethodWrapperBeanMap.class); assertNotNull(result); assertEquals(1, result.size()); MethodWrapperBean bean = result.get("xyz"); assertNotNull(bean); Object ob = bean.value; assertEquals(BooleanValue.class, ob.getClass()); assertEquals(((BooleanValue) ob).b, Boolean.TRUE); } }