1 package com.fasterxml.jackson.databind.views; 2 3 import com.fasterxml.jackson.annotation.JsonCreator; 4 import com.fasterxml.jackson.annotation.JsonProperty; 5 import com.fasterxml.jackson.annotation.JsonView; 6 7 import com.fasterxml.jackson.databind.*; 8 9 public class TestViewDeserialization extends BaseMapTest 10 { 11 // Classes that represent views 12 static class ViewA { } 13 static class ViewAA extends ViewA { } 14 static class ViewB { } 15 static class ViewBB extends ViewB { } 16 17 static class Bean 18 { 19 @JsonView(ViewA.class) 20 public int a; 21 22 @JsonView({ViewAA.class, ViewB.class}) 23 public String aa; 24 25 protected int b; 26 27 @JsonView(ViewB.class) setB(int value)28 public void setB(int value) { b = value; } 29 } 30 31 static class DefaultsBean 32 { 33 public int a; 34 35 @JsonView(ViewA.class) 36 public int b; 37 } 38 39 static class ViewsAndCreatorBean 40 { 41 @JsonView(ViewA.class) 42 public int a; 43 44 @JsonView(ViewB.class) 45 public int b; 46 47 @JsonCreator ViewsAndCreatorBean(@sonProperty"a") int a, @JsonProperty("b") int b)48 public ViewsAndCreatorBean(@JsonProperty("a") int a, 49 @JsonProperty("b") int b) 50 { 51 this.a = a; 52 this.b = b; 53 } 54 } 55 56 /* 57 /************************************************************************ 58 /* Tests 59 /************************************************************************ 60 */ 61 62 private final ObjectMapper mapper = new ObjectMapper(); 63 testSimple()64 public void testSimple() throws Exception 65 { 66 // by default, should have it all... 67 Bean bean = mapper 68 .readValue("{\"a\":3, \"aa\":\"foo\", \"b\": 9 }", Bean.class); 69 assertEquals(3, bean.a); 70 assertEquals("foo", bean.aa); 71 assertEquals(9, bean.b); 72 73 // but with different views, different contents 74 bean = mapper.readerWithView(ViewAA.class) 75 .forType(Bean.class) 76 .readValue("{\"a\":3, \"aa\":\"foo\", \"b\": 9 }"); 77 // should include 'a' and 'aa' (as per view) 78 assertEquals(3, bean.a); 79 assertEquals("foo", bean.aa); 80 // but not 'b' 81 assertEquals(0, bean.b); 82 83 bean = mapper.readerWithView(ViewA.class) 84 .forType(Bean.class) 85 .readValue("{\"a\":1, \"aa\":\"x\", \"b\": 3 }"); 86 assertEquals(1, bean.a); 87 assertNull(bean.aa); 88 assertEquals(0, bean.b); 89 90 bean = mapper.readerFor(Bean.class) 91 .withView(ViewB.class) 92 .readValue("{\"a\":-3, \"aa\":\"y\", \"b\": 2 }"); 93 assertEquals(0, bean.a); 94 assertEquals("y", bean.aa); 95 assertEquals(2, bean.b); 96 } 97 testWithoutDefaultInclusion()98 public void testWithoutDefaultInclusion() throws Exception 99 { 100 // without active view, all included still: 101 DefaultsBean bean = mapper 102 .readValue("{\"a\":3, \"b\": 9 }", DefaultsBean.class); 103 assertEquals(3, bean.a); 104 assertEquals(9, bean.b); 105 106 ObjectMapper myMapper = jsonMapperBuilder() 107 .disable(MapperFeature.DEFAULT_VIEW_INCLUSION) 108 .build(); 109 110 // but with, say, AA, will not get 'b' 111 bean = myMapper.readerWithView(ViewAA.class) 112 .forType(DefaultsBean.class) 113 .readValue("{\"a\":1, \"b\": 2 }"); 114 // 'a' not there any more 115 assertEquals(0, bean.a); 116 assertEquals(2, bean.b); 117 } 118 testWithCreatorAndViews()119 public void testWithCreatorAndViews() throws Exception 120 { 121 ViewsAndCreatorBean result; 122 123 result = mapper.readerFor(ViewsAndCreatorBean.class) 124 .withView(ViewA.class) 125 .readValue(aposToQuotes("{'a':1,'b':2}")); 126 assertEquals(1, result.a); 127 assertEquals(0, result.b); 128 129 result = mapper.readerFor(ViewsAndCreatorBean.class) 130 .withView(ViewB.class) 131 .readValue(aposToQuotes("{'a':1,'b':2}")); 132 assertEquals(0, result.a); 133 assertEquals(2, result.b); 134 135 // and actually... fine to skip incompatible stuff too 136 result = mapper.readerFor(ViewsAndCreatorBean.class) 137 .withView(ViewB.class) 138 .readValue(aposToQuotes("{'a':[ 1, 23, { } ],'b':2}")); 139 assertEquals(0, result.a); 140 assertEquals(2, result.b); 141 } 142 } 143