value = _deserializeWithErrorWrapping(p, ctxt, creatorProp); bean = creator.build(ctxt, buffer); } catch (Exception e) { bean = wrapInstantiationProblem(e, ctxt); return ctxt.handleInstantiationProblem(handledType(), null, _creatorReturnedNullException()); return handlePolymorphic(p, ctxt, bean, unknown); bean = handleUnknownProperties(ctxt, bean, unknown); return deserialize(p, ctxt, bean); SettableBeanProperty prop = _beanProperties.find(propName); if (prop != null) { try { buffer.bufferProperty(prop, _deserializeWithErrorWrapping(p, ctxt, prop)); } catch (UnresolvedForwardReference reference) { BeanReferring referring = handleUnresolvedReference(ctxt, prop, buffer, reference); if (referrings == null) { handleIgnoredProperty(p, ctxt, handledType(), propName); continue; buffer.bufferAnyProperty(_anySetter, propName, _anySetter.deserialize(p, ctxt));
/** * Main deserialization method for bean-based objects (POJOs). */ @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // common case first if (p.isExpectedStartObjectToken()) { if (_vanillaProcessing) { return vanillaDeserialize(p, ctxt, p.nextToken()); } // 23-Sep-2015, tatu: This is wrong at some many levels, but for now... it is // what it is, including "expected behavior". p.nextToken(); if (_objectIdReader != null) { return deserializeWithObjectId(p, ctxt); } return deserializeFromObject(p, ctxt); } return _deserializeOther(p, ctxt, p.getCurrentToken()); }
if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME) && _objectIdReader.isValidReferencePropertyName(p.getCurrentName(), p)) { return deserializeFromObjectId(p, ctxt); return deserializeWithUnwrapped(p, ctxt); return deserializeWithExternalTypeId(p, ctxt); Object bean = deserializeFromObjectUsingNonDefault(p, ctxt); if (_injectables != null) { injectValues(ctxt, bean); p.setCurrentValue(bean); if (p.canReadObjectId()) { Object id = p.getObjectId(); if (id != null) { _handleTypedObjectId(p, ctxt, bean, id); injectValues(ctxt, bean); Class<?> view = ctxt.getActiveView(); if (view != null) { return deserializeWithView(p, ctxt, bean, view); do { p.nextToken(); SettableBeanProperty prop = _beanProperties.find(propName); if (prop != null) { // normal case try {
switch (t) { case VALUE_STRING: return deserializeFromString(p, ctxt); case VALUE_NUMBER_INT: return deserializeFromNumber(p, ctxt); case VALUE_NUMBER_FLOAT: return deserializeFromDouble(p, ctxt); case VALUE_EMBEDDED_OBJECT: return deserializeFromEmbedded(p, ctxt); case VALUE_TRUE: case VALUE_FALSE: return deserializeFromBoolean(p, ctxt); case VALUE_NULL: return deserializeFromNull(p, ctxt); case START_ARRAY: return deserializeFromArray(p, ctxt); case FIELD_NAME: case END_OBJECT: // added to resolve [JACKSON-319], possible related issues if (_vanillaProcessing) { return vanillaDeserialize(p, ctxt, t); return deserializeWithObjectId(p, ctxt); return deserializeFromObject(p, ctxt); default: return ctxt.handleUnexpectedToken(handledType(), p);
/** * Helper method called for rare case of pointing to {@link JsonToken#VALUE_NULL} * token. While this is most often an erroneous condition, there is one specific * case with XML handling where polymorphic type with no properties is exposed * as such, and should be handled same as empty Object. * * @since 2.7 */ protected Object deserializeFromNull(JsonParser p, DeserializationContext ctxt) throws IOException { // 17-Dec-2015, tatu: Highly specialized case, mainly to support polymorphic // "empty" POJOs deserialized from XML, where empty XML tag synthesizes a // `VALUE_NULL` token. if (p.requiresCustomCodec()) { // not only XML module, but mostly it... @SuppressWarnings("resource") TokenBuffer tb = new TokenBuffer(p, ctxt); tb.writeEndObject(); JsonParser p2 = tb.asParser(p); p2.nextToken(); // to point to END_OBJECT // note: don't have ObjectId to consider at this point, so: Object ob = _vanillaProcessing ? vanillaDeserialize(p2, ctxt, JsonToken.END_OBJECT) : deserializeFromObject(p2, ctxt); p2.close(); return ob; } return ctxt.handleUnexpectedToken(handledType(), p); }
if (creatorProp != null) { bean = creator.build(ctxt, buffer); } catch (Exception e) { wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt); continue; // never gets here return handlePolymorphic(jp, ctxt, bean, unknown); bean = handleUnknownProperties(ctxt, bean, unknown); return deserialize(jp, ctxt, bean); unknown = new TokenBuffer(jp.getCodec()); unknown.writeFieldName(propName); unknown.copyCurrentStructure(jp); bean = creator.build(ctxt, buffer); } catch (Exception e) { wrapInstantiationProblem(e, ctxt); return null; // never gets here return handlePolymorphic(null, ctxt, bean, unknown); return handleUnknownProperties(ctxt, bean, unknown);
if (idPropName.equals(jp.getCurrentName())) { return deserializeFromObject(jp, ctxt); TokenBuffer tmpBuffer = new TokenBuffer(jp.getCodec()); TokenBuffer mergedBuffer = null; for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) { String propName = jp.getCurrentName(); mergedBuffer = new TokenBuffer(jp.getCodec()); mergedBuffer.writeFieldName(propName); jp.nextToken(); mergedBuffer.copyCurrentStructure(jp); JsonParser mergedParser = buffer.asParser(); mergedParser.nextToken(); return deserializeFromObject(mergedParser, ctxt);
return deserializeWithUnwrapped(jp, ctxt); return deserializeWithExternalTypeId(jp, ctxt); return deserializeFromObjectUsingNonDefault(jp, ctxt); injectValues(ctxt, bean); Class<?> view = ctxt.getActiveView(); if (view != null) { return deserializeWithView(jp, ctxt, bean, view); for (; jp.getCurrentToken() != JsonToken.END_OBJECT; jp.nextToken()) { String propName = jp.getCurrentName(); jp.nextToken(); SettableBeanProperty prop = _beanProperties.find(propName); if (prop != null) { // normal case try { prop.deserializeAndSet(jp, ctxt, bean); } catch (Exception e) { wrapAndThrow(e, bean, propName, ctxt); _anySetter.deserializeAndSet(jp, ctxt, bean, propName); } catch (Exception e) { wrapAndThrow(e, bean, propName, ctxt); handleUnknownProperty(jp, ctxt, bean, propName);
if (creatorProp != null) { Object value = deserializeWithErrorWrapping(creatorProp, p, ctxt, propName); if (buffer.assignParameter(creatorProp.getCreatorIndex(), value)) { p.nextToken(); // to move to following FIELD_NAME/END_OBJECT Object bean; bean = creator.build(ctxt, buffer); } catch (Exception e) { wrapAndThrow(e, _beanType.getRawClass(), propName, ctxt); return handlePolymorphic(p, ctxt, bean, unknown); bean = handleUnknownProperties(ctxt, bean, unknown); return deserialize(p, ctxt, bean); handleIgnoredProperty(p, ctxt, handledType(), propName); continue; bean = creator.build(ctxt, buffer); } catch (Exception e) { wrapInstantiationProblem(e, ctxt); return handlePolymorphic(null, ctxt, bean, unknown); return handleUnknownProperties(ctxt, bean, unknown);
if ((p.getCurrentTokenId() == JsonTokenId.ID_FIELD_NAME) && _objectIdReader.isValidReferencePropertyName(p.getCurrentName(), p)) { return deserializeFromObjectId(p, ctxt); return deserializeWithUnwrapped(p, ctxt); return deserializeWithExternalTypeId(p, ctxt); Object bean = deserializeFromObjectUsingNonDefault(p, ctxt); if (_injectables != null) { injectValues(ctxt, bean); p.setCurrentValue(bean); if (p.canReadObjectId()) { Object id = p.getObjectId(); if (id != null) { _handleTypedObjectId(p, ctxt, bean, id); injectValues(ctxt, bean); Class<?> view = ctxt.getActiveView(); if (view != null) { return deserializeWithView(p, ctxt, bean, view); String propName = p.getCurrentName(); p.nextToken(); if (!_beanProperties.findDeserializeAndSet(p, ctxt, bean, propName)) { handleUnknownVanilla(p, ctxt, bean, propName);
t = jp.nextToken(); if (_vanillaProcessing) { return vanillaDeserialize(jp, ctxt, t); return deserializeWithObjectId(jp, ctxt); return deserializeFromObject(jp, ctxt); return _missingToken(jp, ctxt); return deserializeFromString(jp, ctxt); case VALUE_NUMBER_INT: return deserializeFromNumber(jp, ctxt); case VALUE_NUMBER_FLOAT: return deserializeFromDouble(jp, ctxt); case VALUE_EMBEDDED_OBJECT: return jp.getEmbeddedObject(); case VALUE_TRUE: case VALUE_FALSE: return deserializeFromBoolean(jp, ctxt); case START_ARRAY: return deserializeFromArray(jp, ctxt); case FIELD_NAME: case END_OBJECT: // added to resolve [JACKSON-319], possible related issues if (_vanillaProcessing) { return vanillaDeserialize(jp, ctxt, t); return deserializeWithObjectId(jp, ctxt);
@Override public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException { if (_nonStandardCreation || _needViewProcesing) { return super.deserializeFromObject(p, ctxt); if (p.hasTokenId(JsonTokenId.ID_FIELD_NAME)) { String propertyName = p.getCurrentName(); do { p.nextToken(); SettableBeanProperty property = _beanProperties.find(propertyName); Object id = property.deserialize(p, ctxt); ReadableObjectId objectId = ctxt.findObjectId(id, _objectIdReader.generator, _objectIdReader.resolver); if (bean == null) { bean = _valueInstantiator.createUsingDefault(ctxt); property.set(bean, id); p.setCurrentValue(bean); property.deserializeAndSet(p, ctxt, bean); } while ((propertyName = p.nextFieldName()) != null);
@Override public AbstractEntity deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { Preconditions.checkState(jp.getCurrentToken() == JsonToken.START_OBJECT); jp.nextToken(); for (JsonToken t = jp.getCurrentToken(); t == JsonToken.FIELD_NAME; t = jp.nextToken()) { String propName = jp.getCurrentName(); jp.nextToken(); SettableBeanProperty property = _beanProperties.find(propName); if (property != null) { Object value = property.deserialize(jp, ctxt); if (property.getName().equals("id") && value != null) { jp.nextToken(); AbstractEntity entity = generalDao.load(entityClass, (Long)value); for (PropertyValue pv = buffer; pv != null; pv = pv.next) pv.assign(bean); defaultDeserializer.deserialize(jp, ctxt, bean); return entity; } else { ctxt.handleUnexpectedToken(entityClass, jp);
JsonDeserializer<Object> subDeser = _findSubclassDeserializer(ctxt, bean, unknownTokens); if (subDeser != null) { if (unknownTokens != null) { unknownTokens.writeEndObject(); JsonParser p2 = unknownTokens.asParser(); p2.nextToken(); // to get to first data field bean = subDeser.deserialize(p2, ctxt, bean); bean = handleUnknownProperties(ctxt, bean, unknownTokens); bean = deserialize(jp, ctxt, bean);
public Object deserializeFromString(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { // First things first: id Object Id is used, most likely that's it if (_objectIdReader != null) { return deserializeFromObjectId(jp, ctxt); } /* Bit complicated if we have delegating creator; may need to use it, * or might not... */ if (_delegateDeserializer != null) { if (!_valueInstantiator.canCreateFromString()) { Object bean = _valueInstantiator.createUsingDelegate(ctxt, _delegateDeserializer.deserialize(jp, ctxt)); if (_injectables != null) { injectValues(ctxt, bean); } return bean; } } return _valueInstantiator.createFromString(ctxt, jp.getText()); }
return deserializeFromObjectId(jp, ctxt); switch (jp.getNumberType()) { case INT: if (_delegateDeserializer != null) { Object bean = _valueInstantiator.createUsingDelegate(ctxt, _delegateDeserializer.deserialize(jp, ctxt)); if (_injectables != null) { injectValues(ctxt, bean); return _valueInstantiator.createFromInt(ctxt, jp.getIntValue()); case LONG: if (_delegateDeserializer != null) { Object bean = _valueInstantiator.createUsingDelegate(ctxt, _delegateDeserializer.deserialize(jp, ctxt)); if (_injectables != null) { injectValues(ctxt, bean); return _valueInstantiator.createFromLong(ctxt, jp.getLongValue()); Object bean = _valueInstantiator.createUsingDelegate(ctxt, _delegateDeserializer.deserialize(jp, ctxt)); if (_injectables != null) { injectValues(ctxt, bean); throw ctxt.instantiationException(getBeanClass(), "no suitable creator method found to deserialize from JSON integer number");
return deserializeFromString(p, ctxt); case VALUE_NUMBER_INT: return deserializeFromNumber(p, ctxt); case VALUE_NUMBER_FLOAT: return deserializeFromDouble(p, ctxt); case VALUE_EMBEDDED_OBJECT: return deserializeFromEmbedded(p, ctxt); case VALUE_TRUE: case VALUE_FALSE: return deserializeFromBoolean(p, ctxt); case START_ARRAY: return deserializeFromArray(p, ctxt); case FIELD_NAME: case END_OBJECT: // added to resolve [JACKSON-319], possible related issues if (_vanillaProcessing) { return vanillaDeserialize(p, ctxt, t); return deserializeWithObjectId(p, ctxt); return deserializeFromObject(p, ctxt); default: throw ctxt.mappingException(handledType());
BeanPropertyMap propertyMap = new BeanPropertyMap(props); propertyMap.assignIndexes(); if (prop.hasViews()) { anyViews = true; break; propertyMap = propertyMap.withProperty(prop); return new BeanDeserializer(this, _beanDesc, propertyMap, _backRefProperties, _ignorableProps, _ignoreAllUnknown, anyViews);
@Override protected Object deserializeFromObjectUsingNonDefault(JsonParser p, DeserializationContext ctxt) throws IOException { JsonStreamContext parent = p.getParsingContext().getParent(); return super.deserializeFromObjectUsingNonDefault(p, ctxt);
BeanPropertyMap propertyMap = BeanPropertyMap.construct(props, _config.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES), _collectAliases(props)); propertyMap.assignIndexes(); if (!anyViews) { for (SettableBeanProperty prop : props) { if (prop.hasViews()) { anyViews = true; break; propertyMap = propertyMap.withProperty(prop); return new BeanDeserializer(this, _beanDesc, propertyMap, _backRefProperties, _ignorableProps, _ignoreAllUnknown, anyViews);