Skip to content

Commit df716c3

Browse files
committed
Convert JsonNodeDeserializer to use nextFieldName() as well
1 parent f4f6434 commit df716c3

File tree

2 files changed

+43
-30
lines changed

2 files changed

+43
-30
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.java

+16-8
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,22 @@ protected final ObjectNode deserializeObject(JsonParser p, DeserializationContex
211211
final JsonNodeFactory nodeFactory) throws IOException
212212
{
213213
ObjectNode node = nodeFactory.objectNode();
214-
JsonToken t = p.getCurrentToken();
215-
if (t == JsonToken.START_OBJECT) {
216-
t = p.nextToken();
214+
String key;
215+
if (p.isExpectedStartObjectToken()) {
216+
key = p.nextFieldName();
217+
} else {
218+
JsonToken t = p.getCurrentToken();
219+
if (t == JsonToken.END_OBJECT) {
220+
return node;
221+
}
222+
if (t != JsonToken.FIELD_NAME) {
223+
throw ctxt.mappingException(handledType(), p.getCurrentToken());
224+
}
225+
key = p.getCurrentName();
217226
}
218-
for (; t == JsonToken.FIELD_NAME; t = p.nextToken()) {
219-
String fieldName = p.getCurrentName();
227+
for (; key != null; key = p.nextFieldName()) {
220228
JsonNode value;
221-
t = p.nextToken();
229+
JsonToken t = p.nextToken();
222230
switch (t.id()) {
223231
case JsonTokenId.ID_START_OBJECT:
224232
value = deserializeObject(p, ctxt, nodeFactory);
@@ -244,10 +252,10 @@ protected final ObjectNode deserializeObject(JsonParser p, DeserializationContex
244252
default:
245253
value = deserializeAny(p, ctxt, nodeFactory);
246254
}
247-
JsonNode old = node.replace(fieldName, value);
255+
JsonNode old = node.replace(key, value);
248256
if (old != null) {
249257
_handleDuplicateField(p, ctxt, nodeFactory,
250-
fieldName, node, old, value);
258+
key, node, old, value);
251259
}
252260
}
253261
return node;

src/main/java/com/fasterxml/jackson/databind/deser/std/MapDeserializer.java

+27-22
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)