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 ;
@@ -38,7 +58,7 @@ public class ObjectReader
38
58
implements Versioned , java .io .Serializable // since 2.1
39
59
{
40
60
private static final long serialVersionUID = 1L ; // since 2.5
41
-
61
+
42
62
private final static JavaType JSON_NODE_TYPE = SimpleType .constructUnsafe (JsonNode .class );
43
63
44
64
/*
@@ -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 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,7 @@ 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 ;
246
276
}
247
277
248
278
/**
@@ -1053,7 +1083,8 @@ public <T> T readValue(InputStream src)
1053
1083
if (_dataFormatReaders != null ) {
1054
1084
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (src ), false );
1055
1085
}
1056
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1086
+
1087
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1057
1088
}
1058
1089
1059
1090
/**
@@ -1069,7 +1100,8 @@ public <T> T readValue(Reader src)
1069
1100
if (_dataFormatReaders != null ) {
1070
1101
_reportUndetectableSource (src );
1071
1102
}
1072
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1103
+
1104
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1073
1105
}
1074
1106
1075
1107
/**
@@ -1085,7 +1117,8 @@ public <T> T readValue(String src)
1085
1117
if (_dataFormatReaders != null ) {
1086
1118
_reportUndetectableSource (src );
1087
1119
}
1088
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1120
+
1121
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1089
1122
}
1090
1123
1091
1124
/**
@@ -1101,7 +1134,8 @@ public <T> T readValue(byte[] src)
1101
1134
if (_dataFormatReaders != null ) {
1102
1135
return (T ) _detectBindAndClose (src , 0 , src .length );
1103
1136
}
1104
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1137
+
1138
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1105
1139
}
1106
1140
1107
1141
/**
@@ -1117,7 +1151,8 @@ public <T> T readValue(byte[] src, int offset, int length)
1117
1151
if (_dataFormatReaders != null ) {
1118
1152
return (T ) _detectBindAndClose (src , offset , length );
1119
1153
}
1120
- return (T ) _bindAndClose (_parserFactory .createParser (src , offset , length ));
1154
+
1155
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src , offset , length )));
1121
1156
}
1122
1157
1123
1158
@ SuppressWarnings ("unchecked" )
@@ -1127,7 +1162,8 @@ public <T> T readValue(File src)
1127
1162
if (_dataFormatReaders != null ) {
1128
1163
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (_inputStream (src )), true );
1129
1164
}
1130
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1165
+
1166
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1131
1167
}
1132
1168
1133
1169
/**
@@ -1143,7 +1179,8 @@ public <T> T readValue(URL src)
1143
1179
if (_dataFormatReaders != null ) {
1144
1180
return (T ) _detectBindAndClose (_dataFormatReaders .findFormat (_inputStream (src )), true );
1145
1181
}
1146
- return (T ) _bindAndClose (_parserFactory .createParser (src ));
1182
+
1183
+ return (T ) _bindAndClose (considerFilter (_parserFactory .createParser (src )));
1147
1184
}
1148
1185
1149
1186
/**
@@ -1160,7 +1197,8 @@ public <T> T readValue(JsonNode src)
1160
1197
if (_dataFormatReaders != null ) {
1161
1198
_reportUndetectableSource (src );
1162
1199
}
1163
- return (T ) _bindAndClose (treeAsTokens (src ));
1200
+
1201
+ return (T ) _bindAndClose (considerFilter (treeAsTokens (src )));
1164
1202
}
1165
1203
1166
1204
/**
@@ -1178,7 +1216,8 @@ public JsonNode readTree(InputStream in)
1178
1216
if (_dataFormatReaders != null ) {
1179
1217
return _detectBindAndCloseAsTree (in );
1180
1218
}
1181
- return _bindAndCloseAsTree (_parserFactory .createParser (in ));
1219
+
1220
+ return _bindAndCloseAsTree (considerFilter (_parserFactory .createParser (in )));
1182
1221
}
1183
1222
1184
1223
/**
@@ -1196,7 +1235,8 @@ public JsonNode readTree(Reader r)
1196
1235
if (_dataFormatReaders != null ) {
1197
1236
_reportUndetectableSource (r );
1198
1237
}
1199
- return _bindAndCloseAsTree (_parserFactory .createParser (r ));
1238
+
1239
+ return _bindAndCloseAsTree (considerFilter (_parserFactory .createParser (r )));
1200
1240
}
1201
1241
1202
1242
/**
@@ -1214,7 +1254,8 @@ public JsonNode readTree(String json)
1214
1254
if (_dataFormatReaders != null ) {
1215
1255
_reportUndetectableSource (json );
1216
1256
}
1217
- return _bindAndCloseAsTree (_parserFactory .createParser (json ));
1257
+
1258
+ return _bindAndCloseAsTree (considerFilter (_parserFactory .createParser (json )));
1218
1259
}
1219
1260
1220
1261
/*
@@ -1268,7 +1309,8 @@ public <T> MappingIterator<T> readValues(InputStream src)
1268
1309
if (_dataFormatReaders != null ) {
1269
1310
return _detectBindAndReadValues (_dataFormatReaders .findFormat (src ), false );
1270
1311
}
1271
- return _bindAndReadValues (_parserFactory .createParser (src ));
1312
+
1313
+ return _bindAndReadValues (considerFilter (_parserFactory .createParser (src )));
1272
1314
}
1273
1315
1274
1316
/**
@@ -1281,7 +1323,7 @@ public <T> MappingIterator<T> readValues(Reader src)
1281
1323
if (_dataFormatReaders != null ) {
1282
1324
_reportUndetectableSource (src );
1283
1325
}
1284
- JsonParser p = _parserFactory .createParser (src );
1326
+ JsonParser p = considerFilter ( _parserFactory .createParser (src ) );
1285
1327
_initForMultiRead (p );
1286
1328
p .nextToken ();
1287
1329
DeserializationContext ctxt = createDeserializationContext (p );
@@ -1300,7 +1342,7 @@ public <T> MappingIterator<T> readValues(String json)
1300
1342
if (_dataFormatReaders != null ) {
1301
1343
_reportUndetectableSource (json );
1302
1344
}
1303
- JsonParser p = _parserFactory .createParser (json );
1345
+ JsonParser p = considerFilter ( _parserFactory .createParser (json ) );
1304
1346
_initForMultiRead (p );
1305
1347
p .nextToken ();
1306
1348
DeserializationContext ctxt = createDeserializationContext (p );
@@ -1316,7 +1358,7 @@ public <T> MappingIterator<T> readValues(byte[] src, int offset, int length)
1316
1358
if (_dataFormatReaders != null ) {
1317
1359
return _detectBindAndReadValues (_dataFormatReaders .findFormat (src , offset , length ), false );
1318
1360
}
1319
- return _bindAndReadValues (_parserFactory .createParser (src ));
1361
+ return _bindAndReadValues (considerFilter ( _parserFactory .createParser (src ) ));
1320
1362
}
1321
1363
1322
1364
/**
@@ -1337,7 +1379,7 @@ public <T> MappingIterator<T> readValues(File src)
1337
1379
return _detectBindAndReadValues (
1338
1380
_dataFormatReaders .findFormat (_inputStream (src )), false );
1339
1381
}
1340
- return _bindAndReadValues (_parserFactory .createParser (src ));
1382
+ return _bindAndReadValues (considerFilter ( _parserFactory .createParser (src ) ));
1341
1383
}
1342
1384
1343
1385
/**
@@ -1352,7 +1394,7 @@ public <T> MappingIterator<T> readValues(URL src)
1352
1394
return _detectBindAndReadValues (
1353
1395
_dataFormatReaders .findFormat (_inputStream (src )), true );
1354
1396
}
1355
- return _bindAndReadValues (_parserFactory .createParser (src ));
1397
+ return _bindAndReadValues (considerFilter ( _parserFactory .createParser (src ) ));
1356
1398
}
1357
1399
1358
1400
/*
@@ -1422,6 +1464,14 @@ protected Object _bind(JsonParser p, Object valueToUpdate) throws IOException
1422
1464
return result ;
1423
1465
}
1424
1466
1467
+ /**
1468
+ * Consider filter when creating JsonParser.
1469
+ */
1470
+ private JsonParser considerFilter (final JsonParser p ) {
1471
+ return _filter == null && !FilteringParserDelegate .class .isInstance (p )
1472
+ ? p : new FilteringParserDelegate (p , _filter , false , false );
1473
+ }
1474
+
1425
1475
protected Object _bindAndClose (JsonParser p ) throws IOException
1426
1476
{
1427
1477
try {
@@ -1734,4 +1784,25 @@ protected JsonDeserializer<Object> _prefetchRootDeserializer(JavaType valueType)
1734
1784
}
1735
1785
return deser ;
1736
1786
}
1787
+
1788
+ /**
1789
+ * Convenience method to bind from {@link JsonPointer}.
1790
+ * {@link JsonPointerBasedFilter} is registered and will be used for parsing later.
1791
+ * @since 2.6
1792
+ */
1793
+ public ObjectReader at (final String value ) {
1794
+ _filter = new JsonPointerBasedFilter (value );
1795
+ return this ;
1796
+ }
1797
+
1798
+ /**
1799
+ * Convenience method to bind from {@link JsonPointer}
1800
+ * {@link JsonPointerBasedFilter} is registered and will be used for parsing later.
1801
+ * @since 2.6
1802
+ */
1803
+ public ObjectReader at (final JsonPointer pointer ) {
1804
+ _filter = new JsonPointerBasedFilter (pointer );
1805
+ return this ;
1806
+ }
1807
+
1737
1808
}
0 commit comments