@@ -389,10 +389,6 @@ public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
389
389
protected final void _readAndBind (JsonParser p , DeserializationContext ctxt ,
390
390
Map <Object ,Object > result ) throws IOException
391
391
{
392
- JsonToken t = p .getCurrentToken ();
393
- if (t == JsonToken .START_OBJECT ) {
394
- t = p .nextToken ();
395
- }
396
392
final KeyDeserializer keyDes = _keyDeserializer ;
397
393
final JsonDeserializer <Object > valueDes = _valueDeserializer ;
398
394
final TypeDeserializer typeDeser = _valueTypeDeserializer ;
@@ -402,17 +398,30 @@ protected final void _readAndBind(JsonParser p, DeserializationContext ctxt,
402
398
if (useObjectId ) {
403
399
referringAccumulator = new MapReferringAccumulator (_mapType .getContentType ().getRawClass (), result );
404
400
}
405
- for (; t == JsonToken .FIELD_NAME ; t = p .nextToken ()) {
406
- // Must point to field name
407
- String fieldName = p .getCurrentName ();
408
- Object key = keyDes .deserializeKey (fieldName , ctxt );
401
+
402
+ String keyStr ;
403
+ if (p .isExpectedStartObjectToken ()) {
404
+ keyStr = p .nextFieldName ();
405
+ } else {
406
+ JsonToken t = p .getCurrentToken ();
407
+ if (t == JsonToken .END_OBJECT ) {
408
+ return ;
409
+ }
410
+ if (t != JsonToken .FIELD_NAME ) {
411
+ throw ctxt .mappingException (_mapType .getRawClass (), p .getCurrentToken ());
412
+ }
413
+ keyStr = p .getCurrentName ();
414
+ }
415
+
416
+ for (; keyStr != null ; keyStr = p .nextFieldName ()) {
417
+ Object key = keyDes .deserializeKey (keyStr , ctxt );
409
418
// And then the value...
410
- t = p .nextToken ();
411
- if (_ignorableProperties != null && _ignorableProperties .contains (fieldName )) {
419
+ JsonToken t = p .nextToken ();
420
+ if (_ignorableProperties != null && _ignorableProperties .contains (keyStr )) {
412
421
p .skipChildren ();
413
422
continue ;
414
423
}
415
- try {
424
+ try {
416
425
// Note: must handle null explicitly here; value deserializers won't
417
426
Object value ;
418
427
if (t == JsonToken .VALUE_NULL ) {
@@ -434,7 +443,7 @@ protected final void _readAndBind(JsonParser p, DeserializationContext ctxt,
434
443
} catch (UnresolvedForwardReference reference ) {
435
444
handleUnresolvedReference (p , referringAccumulator , key , reference );
436
445
} catch (Exception e ) {
437
- wrapAndThrow (e , result , fieldName );
446
+ wrapAndThrow (e , result , keyStr );
438
447
}
439
448
}
440
449
}
@@ -458,19 +467,18 @@ protected final void _readAndBindStringMap(JsonParser p, DeserializationContext
458
467
String key ;
459
468
if (p .isExpectedStartObjectToken ()) {
460
469
key = p .nextFieldName ();
461
- } else { // should we verify it's FIELD_NAME?
470
+ } else {
462
471
JsonToken t = p .getCurrentToken ();
463
472
if (t == JsonToken .END_OBJECT ) {
464
473
return ;
465
474
}
466
- if (! p . hasToken ( JsonToken .FIELD_NAME ) ) {
475
+ if (t != JsonToken .FIELD_NAME ) {
467
476
throw ctxt .mappingException (_mapType .getRawClass (), p .getCurrentToken ());
468
477
}
469
478
key = p .getCurrentName ();
470
479
}
471
480
472
481
for (; key != null ; key = p .nextFieldName ()) {
473
- // And then the value...
474
482
JsonToken t = p .nextToken ();
475
483
if (_ignorableProperties != null && _ignorableProperties .contains (key )) {
476
484
p .skipChildren ();
@@ -513,13 +521,10 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
513
521
String key ;
514
522
if (p .isExpectedStartObjectToken ()) {
515
523
key = p .nextFieldName ();
516
- } else { // should we verify it's FIELD_NAME?
517
- JsonToken t = p .getCurrentToken ();
518
- if (p .hasToken (JsonToken .FIELD_NAME )) {
519
- key = p .getCurrentName ();
520
- } else {
521
- key = null ;
522
- }
524
+ } else if (p .hasToken (JsonToken .FIELD_NAME )) {
525
+ key = p .getCurrentName ();
526
+ } else {
527
+ key = null ;
523
528
}
524
529
525
530
for (; key != null ; key = p .nextFieldName ()) {
0 commit comments