• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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