1
1
package com .fasterxml .jackson .databind ;
2
2
3
- import java .io .*;
3
+ import java .io .File ;
4
+ import java .io .FileInputStream ;
5
+ import java .io .IOException ;
6
+ import java .io .InputStream ;
7
+ import java .io .Reader ;
4
8
import java .net .URL ;
5
9
import java .util .Iterator ;
6
10
import java .util .Locale ;
7
11
import java .util .Map ;
8
12
import java .util .TimeZone ;
9
13
import java .util .concurrent .ConcurrentHashMap ;
10
14
11
- import com .fasterxml .jackson .core .*;
15
+ import com .fasterxml .jackson .core .Base64Variant ;
16
+ import com .fasterxml .jackson .core .FormatSchema ;
17
+ import com .fasterxml .jackson .core .JsonFactory ;
18
+ import com .fasterxml .jackson .core .JsonGenerator ;
19
+ import com .fasterxml .jackson .core .JsonLocation ;
20
+ import com .fasterxml .jackson .core .JsonParseException ;
21
+ import com .fasterxml .jackson .core .JsonParser ;
22
+ import com .fasterxml .jackson .core .JsonPointer ;
23
+ import com .fasterxml .jackson .core .JsonProcessingException ;
24
+ import com .fasterxml .jackson .core .JsonToken ;
25
+ import com .fasterxml .jackson .core .ObjectCodec ;
26
+ import com .fasterxml .jackson .core .TreeNode ;
27
+ import com .fasterxml .jackson .core .Version ;
28
+ import com .fasterxml .jackson .core .Versioned ;
29
+ import com .fasterxml .jackson .core .filter .FilteringParserDelegate ;
30
+ import com .fasterxml .jackson .core .filter .JsonPointerBasedFilter ;
31
+ import com .fasterxml .jackson .core .filter .TokenFilter ;
12
32
import com .fasterxml .jackson .core .type .ResolvedType ;
13
33
import com .fasterxml .jackson .core .type .TypeReference ;
14
34
import com .fasterxml .jackson .databind .cfg .ContextAttributes ;
@@ -69,6 +89,12 @@ public class ObjectReader
69
89
*/
70
90
protected final boolean _unwrapRoot ;
71
91
92
+ /**
93
+ * Filter to be consider for JsonParser.
94
+ * Default value to be null as filter not considered.
95
+ */
96
+ private final TokenFilter _filter ;
97
+
72
98
/*
73
99
/**********************************************************
74
100
/* Configuration that can be changed during building
@@ -178,6 +204,7 @@ protected ObjectReader(ObjectMapper mapper, DeserializationConfig config,
178
204
179
205
_rootDeserializer = _prefetchRootDeserializer (valueType );
180
206
_dataFormatReaders = null ;
207
+ _filter = null ;
181
208
}
182
209
183
210
/**
@@ -204,6 +231,7 @@ protected ObjectReader(ObjectReader base, DeserializationConfig config,
204
231
_injectableValues = injectableValues ;
205
232
_unwrapRoot = config .useRootWrapping ();
206
233
_dataFormatReaders = dataFormatReaders ;
234
+ _filter = base ._filter ;
207
235
}
208
236
209
237
/**
@@ -224,6 +252,7 @@ protected ObjectReader(ObjectReader base, DeserializationConfig config)
224
252
_injectableValues = base ._injectableValues ;
225
253
_unwrapRoot = config .useRootWrapping ();
226
254
_dataFormatReaders = base ._dataFormatReaders ;
255
+ _filter = base ._filter ;
227
256
}
228
257
229
258
protected ObjectReader (ObjectReader base , JsonFactory f )
@@ -243,6 +272,22 @@ protected ObjectReader(ObjectReader base, JsonFactory f)
243
272
_injectableValues = base ._injectableValues ;
244
273
_unwrapRoot = base ._unwrapRoot ;
245
274
_dataFormatReaders = base ._dataFormatReaders ;
275
+ _filter = base ._filter ;
276
+ }
277
+
278
+ protected ObjectReader (ObjectReader base , TokenFilter filter ) {
279
+ _config = base ._config ;
280
+ _context = base ._context ;
281
+ _rootDeserializers = base ._rootDeserializers ;
282
+ _parserFactory = base ._parserFactory ;
283
+ _valueType = base ._valueType ;
284
+ _rootDeserializer = base ._rootDeserializer ;
285
+ _valueToUpdate = base ._valueToUpdate ;
286
+ _schema = base ._schema ;
287
+ _injectableValues = base ._injectableValues ;
288
+ _unwrapRoot = base ._unwrapRoot ;
289
+ _dataFormatReaders = base ._dataFormatReaders ;
290
+ _filter = filter ;
246
291
}
247
292
248
293
/**
@@ -1053,7 +1098,8 @@ public <T> T readValue(InputStream src)
1053
1098
if (_dataFormatReaders != null ) {
1054
1099
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (src ), false );
1055
1100
}
1056
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1101
+
1102
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1057
1103
}
1058
1104
1059
1105
/**
@@ -1069,7 +1115,8 @@ public <T> T readValue(Reader src)
1069
1115
if (_dataFormatReaders != null ) {
1070
1116
_reportUndetectableSource (src );
1071
1117
}
1072
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1118
+
1119
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1073
1120
}
1074
1121
1075
1122
/**
@@ -1085,7 +1132,8 @@ public <T> T readValue(String src)
1085
1132
if (_dataFormatReaders != null ) {
1086
1133
_reportUndetectableSource (src );
1087
1134
}
1088
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1135
+
1136
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1089
1137
}
1090
1138
1091
1139
/**
@@ -1101,7 +1149,8 @@ public <T> T readValue(byte[] src)
1101
1149
if (_dataFormatReaders != null ) {
1102
1150
return (T ) _detectBindAndClose (src , 0 , src .length );
1103
1151
}
1104
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1152
+
1153
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1105
1154
}
1106
1155
1107
1156
/**
@@ -1117,7 +1166,8 @@ public <T> T readValue(byte[] src, int offset, int length)
1117
1166
if (_dataFormatReaders != null ) {
1118
1167
return (T ) _detectBindAndClose (src , offset , length );
1119
1168
}
1120
- return (T ) _bindAndClose (_parserFactory .createParser (src , offset , length ));
1169
+
1170
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src , offset , length )));
1121
1171
}
1122
1172
1123
1173
@ SuppressWarnings ("unchecked" )
@@ -1127,7 +1177,8 @@ public <T> T readValue(File src)
1127
1177
if (_dataFormatReaders != null ) {
1128
1178
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (_inputStream (src )), true );
1129
1179
}
1130
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1180
+
1181
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1131
1182
}
1132
1183
1133
1184
/**
@@ -1143,7 +1194,8 @@ public <T> T readValue(URL src)
1143
1194
if (_dataFormatReaders != null ) {
1144
1195
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (_inputStream (src )), true );
1145
1196
}
1146
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1197
+
1198
+ return (T ) _bindAndClose (_considerFilter (_parserFactory .createParser (src )));
1147
1199
}
1148
1200
1149
1201
/**
@@ -1160,7 +1212,8 @@ public <T> T readValue(JsonNode src)
1160
1212
if (_dataFormatReaders != null ) {
1161
1213
_reportUndetectableSource (src );
1162
1214
}
1163
- return (T ) _bindAndClose (treeAsTokens (src ));
1215
+
1216
+ return (T ) _bindAndClose (_considerFilter (treeAsTokens (src )));
1164
1217
}
1165
1218
1166
1219
/**
@@ -1178,7 +1231,8 @@ public JsonNode readTree(InputStream in)
1178
1231
if (_dataFormatReaders != null ) {
1179
1232
return _detectBindAndCloseAsTree (in );
1180
1233
}
1181
- return _bindAndCloseAsTree (_parserFactory .createParser (in ));
1234
+
1235
+ return _bindAndCloseAsTree (_considerFilter (_parserFactory .createParser (in )));
1182
1236
}
1183
1237
1184
1238
/**
@@ -1196,7 +1250,8 @@ public JsonNode readTree(Reader r)
1196
1250
if (_dataFormatReaders != null ) {
1197
1251
_reportUndetectableSource (r );
1198
1252
}
1199
- return _bindAndCloseAsTree (_parserFactory .createParser (r ));
1253
+
1254
+ return _bindAndCloseAsTree (_considerFilter (_parserFactory .createParser (r )));
1200
1255
}
1201
1256
1202
1257
/**
@@ -1214,7 +1269,8 @@ public JsonNode readTree(String json)
1214
1269
if (_dataFormatReaders != null ) {
1215
1270
_reportUndetectableSource (json );
1216
1271
}
1217
- return _bindAndCloseAsTree (_parserFactory .createParser (json ));
1272
+
1273
+ return _bindAndCloseAsTree (_considerFilter (_parserFactory .createParser (json )));
1218
1274
}
1219
1275
1220
1276
/*
@@ -1268,7 +1324,8 @@ public <T> MappingIterator<T> readValues(InputStream src)
1268
1324
if (_dataFormatReaders != null ) {
1269
1325
return _detectBindAndReadValues (_dataFormatReaders .findFormat (src ), false );
1270
1326
}
1271
- return _bindAndReadValues (_parserFactory .createParser (src ));
1327
+
1328
+ return _bindAndReadValues (_considerFilter (_parserFactory .createParser (src )));
1272
1329
}
1273
1330
1274
1331
/**
@@ -1281,7 +1338,7 @@ public <T> MappingIterator<T> readValues(Reader src)
1281
1338
if (_dataFormatReaders != null ) {
1282
1339
_reportUndetectableSource (src );
1283
1340
}
1284
- JsonParser p = _parserFactory .createParser (src );
1341
+ JsonParser p = _considerFilter ( _parserFactory .createParser (src ) );
1285
1342
_initForMultiRead (p );
1286
1343
p .nextToken ();
1287
1344
DeserializationContext ctxt = createDeserializationContext (p );
@@ -1300,7 +1357,7 @@ public <T> MappingIterator<T> readValues(String json)
1300
1357
if (_dataFormatReaders != null ) {
1301
1358
_reportUndetectableSource (json );
1302
1359
}
1303
- JsonParser p = _parserFactory .createParser (json );
1360
+ JsonParser p = _considerFilter ( _parserFactory .createParser (json ) );
1304
1361
_initForMultiRead (p );
1305
1362
p .nextToken ();
1306
1363
DeserializationContext ctxt = createDeserializationContext (p );
@@ -1316,7 +1373,7 @@ public <T> MappingIterator<T> readValues(byte[] src, int offset, int length)
1316
1373
if (_dataFormatReaders != null ) {
1317
1374
return _detectBindAndReadValues (_dataFormatReaders .findFormat (src , offset , length ), false );
1318
1375
}
1319
- return _bindAndReadValues (_parserFactory .createParser (src ));
1376
+ return _bindAndReadValues (_considerFilter ( _parserFactory .createParser (src ) ));
1320
1377
}
1321
1378
1322
1379
/**
@@ -1337,7 +1394,7 @@ public <T> MappingIterator<T> readValues(File src)
1337
1394
return _detectBindAndReadValues (
1338
1395
_dataFormatReaders .findFormat (_inputStream (src )), false );
1339
1396
}
1340
- return _bindAndReadValues (_parserFactory .createParser (src ));
1397
+ return _bindAndReadValues (_considerFilter ( _parserFactory .createParser (src ) ));
1341
1398
}
1342
1399
1343
1400
/**
@@ -1352,7 +1409,7 @@ public <T> MappingIterator<T> readValues(URL src)
1352
1409
return _detectBindAndReadValues (
1353
1410
_dataFormatReaders .findFormat (_inputStream (src )), true );
1354
1411
}
1355
- return _bindAndReadValues (_parserFactory .createParser (src ));
1412
+ return _bindAndReadValues (_considerFilter ( _parserFactory .createParser (src ) ));
1356
1413
}
1357
1414
1358
1415
/*
@@ -1422,6 +1479,14 @@ protected Object _bind(JsonParser p, Object valueToUpdate) throws IOException
1422
1479
return result ;
1423
1480
}
1424
1481
1482
+ /**
1483
+ * Consider filter when creating JsonParser.
1484
+ */
1485
+ protected JsonParser _considerFilter (final JsonParser p ) {
1486
+ return _filter == null || FilteringParserDelegate .class .isInstance (p )
1487
+ ? p : new FilteringParserDelegate (p , _filter , false , false );
1488
+ }
1489
+
1425
1490
protected Object _bindAndClose (JsonParser p ) throws IOException
1426
1491
{
1427
1492
try {
@@ -1734,4 +1799,22 @@ protected JsonDeserializer<Object> _prefetchRootDeserializer(JavaType valueType)
1734
1799
}
1735
1800
return deser ;
1736
1801
}
1802
+
1803
+ /**
1804
+ * Convenience method to bind from {@link JsonPointer}.
1805
+ * {@link JsonPointerBasedFilter} is registered and will be used for parsing later.
1806
+ * @since 2.6
1807
+ */
1808
+ public ObjectReader at (final String value ) {
1809
+ return new ObjectReader (this , new JsonPointerBasedFilter (value ));
1810
+ }
1811
+
1812
+ /**
1813
+ * Convenience method to bind from {@link JsonPointer}
1814
+ * {@link JsonPointerBasedFilter} is registered and will be used for parsing later.
1815
+ * @since 2.6
1816
+ */
1817
+ public ObjectReader at (final JsonPointer pointer ) {
1818
+ return new ObjectReader (this , new JsonPointerBasedFilter (pointer ));
1819
+ }
1737
1820
}
0 commit comments