@@ -389,10 +389,6 @@ public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt,
389389 protected final void _readAndBind (JsonParser p , DeserializationContext ctxt ,
390390 Map <Object ,Object > result ) throws IOException
391391 {
392- JsonToken t = p .getCurrentToken ();
393- if (t == JsonToken .START_OBJECT ) {
394- t = p .nextToken ();
395- }
396392 final KeyDeserializer keyDes = _keyDeserializer ;
397393 final JsonDeserializer <Object > valueDes = _valueDeserializer ;
398394 final TypeDeserializer typeDeser = _valueTypeDeserializer ;
@@ -402,17 +398,30 @@ protected final void _readAndBind(JsonParser p, DeserializationContext ctxt,
402398 if (useObjectId ) {
403399 referringAccumulator = new MapReferringAccumulator (_mapType .getContentType ().getRawClass (), result );
404400 }
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 );
409418 // 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 )) {
412421 p .skipChildren ();
413422 continue ;
414423 }
415- try {
424+ try {
416425 // Note: must handle null explicitly here; value deserializers won't
417426 Object value ;
418427 if (t == JsonToken .VALUE_NULL ) {
@@ -434,7 +443,7 @@ protected final void _readAndBind(JsonParser p, DeserializationContext ctxt,
434443 } catch (UnresolvedForwardReference reference ) {
435444 handleUnresolvedReference (p , referringAccumulator , key , reference );
436445 } catch (Exception e ) {
437- wrapAndThrow (e , result , fieldName );
446+ wrapAndThrow (e , result , keyStr );
438447 }
439448 }
440449 }
@@ -458,19 +467,18 @@ protected final void _readAndBindStringMap(JsonParser p, DeserializationContext
458467 String key ;
459468 if (p .isExpectedStartObjectToken ()) {
460469 key = p .nextFieldName ();
461- } else { // should we verify it's FIELD_NAME?
470+ } else {
462471 JsonToken t = p .getCurrentToken ();
463472 if (t == JsonToken .END_OBJECT ) {
464473 return ;
465474 }
466- if (! p . hasToken ( JsonToken .FIELD_NAME ) ) {
475+ if (t != JsonToken .FIELD_NAME ) {
467476 throw ctxt .mappingException (_mapType .getRawClass (), p .getCurrentToken ());
468477 }
469478 key = p .getCurrentName ();
470479 }
471480
472481 for (; key != null ; key = p .nextFieldName ()) {
473- // And then the value...
474482 JsonToken t = p .nextToken ();
475483 if (_ignorableProperties != null && _ignorableProperties .contains (key )) {
476484 p .skipChildren ();
@@ -513,13 +521,10 @@ public Map<Object,Object> _deserializeUsingCreator(JsonParser p, Deserialization
513521 String key ;
514522 if (p .isExpectedStartObjectToken ()) {
515523 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 ;
523528 }
524529
525530 for (; key != null ; key = p .nextFieldName ()) {
0 commit comments