package com.fasterxml.jackson.databind.convert; import java.math.BigDecimal; import java.util.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.util.StdConverter; public class TestConvertingDeserializer extends com.fasterxml.jackson.databind.BaseMapTest { @JsonDeserialize(converter=ConvertingBeanConverter.class) static class ConvertingBean { protected int x, y; protected ConvertingBean(int x, int y) { this.x = x; this.y = y; } } static class Point { protected int x, y; public Point(int v1, int v2) { x = v1; y = v2; } } static class ConvertingBeanContainer { public List<ConvertingBean> values; public ConvertingBeanContainer() { } public ConvertingBeanContainer(ConvertingBean... beans) { values = Arrays.asList(beans); } } static class ConvertingBeanConverter extends StdConverter<int[],ConvertingBean> { @Override public ConvertingBean convert(int[] values) { return new ConvertingBean(values[0], values[1]); } } private static class PointConverter extends StdConverter<int[], Point> { @Override public Point convert(int[] value) { return new Point(value[0], value[1]); } } static class PointWrapper { @JsonDeserialize(converter=PointConverter.class) public Point value; protected PointWrapper() { } public PointWrapper(int x, int y) { value = new Point(x, y); } } static class PointListWrapperArray { @JsonDeserialize(contentConverter=PointConverter.class) public Point[] values; } static class PointListWrapperList { @JsonDeserialize(contentConverter=PointConverter.class) public List<Point> values; } static class PointListWrapperMap { @JsonDeserialize(contentConverter=PointConverter.class) public Map<String,Point> values; } static class LowerCaser extends StdConverter<String, String> { @Override public String convert(String value) { return value.toLowerCase(); } } static class LowerCaseText { @JsonDeserialize(converter=LowerCaser.class) public String text; } static class LowerCaseTextArray { @JsonDeserialize(contentConverter=LowerCaser.class) public String[] texts; } // for [databind#795] static class ToNumberConverter extends StdConverter<String,Number> { @Override public Number convert(String value) { return new BigDecimal(value); } } static class Issue795Bean { @JsonDeserialize(converter=ToNumberConverter.class) public Number value; } /* /********************************************************** /* Test methods /********************************************************** */ public void testClassAnnotationSimple() throws Exception { ConvertingBean bean = objectReader(ConvertingBean.class).readValue("[1,2]"); assertNotNull(bean); assertEquals(1, bean.x); assertEquals(2, bean.y); } public void testClassAnnotationForLists() throws Exception { ConvertingBeanContainer container = objectReader(ConvertingBeanContainer.class) .readValue("{\"values\":[[1,2],[3,4]]}"); assertNotNull(container); assertNotNull(container.values); assertEquals(2, container.values.size()); assertEquals(4, container.values.get(1).y); } public void testPropertyAnnotationSimple() throws Exception { PointWrapper wrapper = objectReader(PointWrapper.class).readValue("{\"value\":[3,4]}"); assertNotNull(wrapper); assertNotNull(wrapper.value); assertEquals(3, wrapper.value.x); assertEquals(4, wrapper.value.y); } public void testPropertyAnnotationLowerCasing() throws Exception { LowerCaseText text = objectReader(LowerCaseText.class).readValue("{\"text\":\"Yay!\"}"); assertNotNull(text); assertNotNull(text.text); assertEquals("yay!", text.text); } public void testPropertyAnnotationArrayLC() throws Exception { LowerCaseTextArray texts = objectReader(LowerCaseTextArray.class).readValue("{\"texts\":[\"ABC\"]}"); assertNotNull(texts); assertNotNull(texts.texts); assertEquals(1, texts.texts.length); assertEquals("abc", texts.texts[0]); } public void testPropertyAnnotationForArrays() throws Exception { PointListWrapperArray array = objectReader(PointListWrapperArray.class) .readValue("{\"values\":[[4,5],[5,4]]}"); assertNotNull(array); assertNotNull(array.values); assertEquals(2, array.values.length); assertEquals(5, array.values[1].x); } public void testPropertyAnnotationForLists() throws Exception { PointListWrapperList array = objectReader(PointListWrapperList.class) .readValue("{\"values\":[[7,8],[8,7]]}"); assertNotNull(array); assertNotNull(array.values); assertEquals(2, array.values.size()); assertEquals(7, array.values.get(0).x); } public void testPropertyAnnotationForMaps() throws Exception { PointListWrapperMap map = objectReader(PointListWrapperMap.class) .readValue("{\"values\":{\"a\":[1,2]}}"); assertNotNull(map); assertNotNull(map.values); assertEquals(1, map.values.size()); Point p = map.values.get("a"); assertNotNull(p); assertEquals(1, p.x); assertEquals(2, p.y); } // [databind#795] public void testConvertToAbstract() throws Exception { Issue795Bean bean = objectReader(Issue795Bean.class) .readValue("{\"value\":\"1.25\"}"); assertNotNull(bean.value); assertTrue("Type not BigDecimal but "+bean.value.getClass(), bean.value instanceof BigDecimal); assertEquals(new BigDecimal("1.25"), bean.value); } }