27
27
import java .util .EnumSet ;
28
28
import java .util .HashMap ;
29
29
import java .util .Map ;
30
+ import java .util .NoSuchElementException ;
30
31
import java .util .function .BiConsumer ;
31
32
import java .util .function .ObjIntConsumer ;
32
33
import java .util .function .Supplier ;
@@ -70,7 +71,7 @@ public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName,
70
71
}
71
72
}
72
73
73
- private static final FieldDeserializer <Object > IGNORED_FIELD = new FieldDeserializer <Object >("-" , null ) {
74
+ private static final FieldDeserializer <? > IGNORED_FIELD = new FieldDeserializer <Object >("-" , null ) {
74
75
@ Override
75
76
public void deserialize (JsonParser parser , JsonpMapper mapper , String fieldName , Object object ) {
76
77
JsonpUtils .skipValue (parser );
@@ -80,9 +81,10 @@ public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName,
80
81
//---------------------------------------------------------------------------------------------
81
82
82
83
private final Supplier <ObjectType > constructor ;
83
- protected final Map <String , FieldDeserializer <? >> fieldDeserializers ;
84
+ protected final Map <String , FieldDeserializer <ObjectType >> fieldDeserializers ;
84
85
private BiConsumer <ObjectType , String > keySetter ;
85
86
private String typeProperty ;
87
+ private FieldDeserializer <ObjectType > shortcutProperty ;
86
88
private QuadConsumer <ObjectType , String , JsonParser , JsonpMapper > unknownFieldHandler ;
87
89
88
90
public ObjectDeserializer (Supplier <ObjectType > constructor ) {
@@ -101,6 +103,10 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
101
103
return null ;
102
104
}
103
105
106
+ if (event != Event .START_OBJECT && shortcutProperty != null ) {
107
+ shortcutProperty .deserialize (parser , mapper , shortcutProperty .name , value );
108
+ }
109
+
104
110
if (keySetter != null ) {
105
111
String key = JsonpUtils .expectKeyName (parser , parser .next ());
106
112
keySetter .accept (value , key );
@@ -114,8 +120,7 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
114
120
JsonpUtils .expectEvent (parser , Event .KEY_NAME , event );
115
121
String fieldName = parser .getString ();
116
122
117
- @ SuppressWarnings ("unchecked" )
118
- FieldDeserializer <ObjectType > fieldDeserializer = (FieldDeserializer <ObjectType >) fieldDeserializers .get (fieldName );
123
+ FieldDeserializer <ObjectType > fieldDeserializer = fieldDeserializers .get (fieldName );
119
124
if (fieldDeserializer == null ) {
120
125
parseUnknownField (parser , mapper , fieldName , value );
121
126
} else {
@@ -129,8 +134,7 @@ public ObjectType deserialize(ObjectType value, JsonParser parser, JsonpMapper m
129
134
String variant = unionInfo .getKey ();
130
135
JsonParser innerParser = unionInfo .getValue ();
131
136
132
- @ SuppressWarnings ("unchecked" )
133
- FieldDeserializer <ObjectType > fieldDeserializer = (FieldDeserializer <ObjectType >) fieldDeserializers .get (variant );
137
+ FieldDeserializer <ObjectType > fieldDeserializer = fieldDeserializers .get (variant );
134
138
if (fieldDeserializer == null ) {
135
139
parseUnknownField (parser , mapper , variant , value );
136
140
} else {
@@ -164,8 +168,17 @@ public void setUnknownFieldHandler(QuadConsumer<ObjectType, String, JsonParser,
164
168
this .unknownFieldHandler = unknownFieldHandler ;
165
169
}
166
170
171
+ @ SuppressWarnings ("unchecked" )
167
172
public void ignore (String name ) {
168
- this .fieldDeserializers .put (name , IGNORED_FIELD );
173
+ this .fieldDeserializers .put (name , (FieldDeserializer <ObjectType >) IGNORED_FIELD );
174
+ }
175
+
176
+ @ Override
177
+ public void shortcutProperty (String name ) {
178
+ this .shortcutProperty = this .fieldDeserializers .get (name );
179
+ if (this .shortcutProperty == null ) {
180
+ throw new NoSuchElementException ("No deserializer was setup for '" + name + "'" );
181
+ }
169
182
}
170
183
171
184
//----- Object types
0 commit comments