org.codehaus.jackson.map.deser
Class BeanDeserializer

java.lang.Object
  extended by org.codehaus.jackson.map.JsonDeserializer<T>
      extended by org.codehaus.jackson.map.deser.StdDeserializer<Object>
          extended by org.codehaus.jackson.map.deser.BeanDeserializer
All Implemented Interfaces:
ResolvableDeserializer
Direct Known Subclasses:
ThrowableDeserializer

public class BeanDeserializer
extends StdDeserializer<Object>
implements ResolvableDeserializer

Deserializer class that can deserialize instances of arbitrary bean objects, usually from JSON Object structs, but possibly also from simple types like String values.


Nested Class Summary
 
Nested classes/interfaces inherited from class org.codehaus.jackson.map.deser.StdDeserializer
StdDeserializer.AtomicBooleanDeserializer, StdDeserializer.AtomicReferenceDeserializer, StdDeserializer.BigDecimalDeserializer, StdDeserializer.BigIntegerDeserializer, StdDeserializer.BooleanDeserializer, StdDeserializer.ByteDeserializer, StdDeserializer.CalendarDeserializer, StdDeserializer.CharacterDeserializer, StdDeserializer.ClassDeserializer, StdDeserializer.DoubleDeserializer, StdDeserializer.FloatDeserializer, StdDeserializer.IntegerDeserializer, StdDeserializer.LongDeserializer, StdDeserializer.NumberDeserializer, StdDeserializer.PrimitiveOrWrapperDeserializer<T>, StdDeserializer.ShortDeserializer, StdDeserializer.SqlDateDeserializer, StdDeserializer.StackTraceElementDeserializer, StdDeserializer.StringDeserializer, StdDeserializer.TokenBufferDeserializer
 
Nested classes/interfaces inherited from class org.codehaus.jackson.map.JsonDeserializer
JsonDeserializer.None
 
Field Summary
protected  SettableAnyProperty _anySetter
          Fallback setter used for handling any properties that are not mapped to regular setters.
protected  HashMap<String,SettableBeanProperty> _backRefs
          We may also have one or more back reference fields (usually zero or one).
protected  JavaType _beanType
          Declared type of the bean this deserializer handles.
protected  Constructor<?> _defaultConstructor
          Default constructor used to instantiate the bean when mapping from Json object, and only using setters for initialization (not specific constructors).
protected  org.codehaus.jackson.map.deser.Creator.Delegating _delegatingCreator
          If the bean class can be instantiated using a creator (an annotated single arg constructor or static method), this object is used for handling details of how delegate-based deserialization and instance construction works
protected  HashSet<String> _ignorableProps
          In addition to properties that are set, we will also keep track of recognized but ignorable properties: these will be skipped without errors or warnings.
protected  boolean _ignoreAllUnknown
          Flag that can be set to ignore and skip unknown properties.
protected  org.codehaus.jackson.map.deser.Creator.NumberBased _numberCreator
          If the "bean" class can be instantiated using just a single numeric (int, long) value (via constructor, static method etc), this object knows how to invoke method/constructor in question.
protected  org.codehaus.jackson.map.deser.Creator.PropertyBased _propertyBasedCreator
          If the bean needs to be instantiated using constructor or factory method that takes one or more named properties as argument(s), this creator is used for instantiation.
protected  HashMap<String,SettableBeanProperty> _props
          Things set via setters (modifiers) are included in this Map.
protected  org.codehaus.jackson.map.deser.Creator.StringBased _stringCreator
          If the "bean" class can be instantiated using just a single String (via constructor, static method etc), this object knows how to invoke method/constructor in question.
protected  HashMap<ClassKey,JsonDeserializer<Object>> _subDeserializers
          Lazily constructed map used to contain deserializers needed for polymorphic subtypes.
 
Fields inherited from class org.codehaus.jackson.map.deser.StdDeserializer
_valueClass
 
Constructor Summary
BeanDeserializer(JavaType type)
           
 
Method Summary
protected  Object _deserializeUsingPropertyBased(JsonParser jp, DeserializationContext ctxt)
          Method called to deserialize bean using "property-based creator": this means that a non-default constructor or factory method is called, and then possibly other setters.
protected  JsonDeserializer<Object> _findSubclassDeserializer(DeserializationContext ctxt, Object bean, TokenBuffer unknownTokens)
          Helper method called to (try to) locate deserializer for given sub-type of type that this deserializer handles.
 void addBackReferenceProperty(String referenceName, SettableBeanProperty prop)
           
 void addIgnorable(String propName)
          Method that will add property name as one of properties that can be ignored if not recognized.
 void addProperty(SettableBeanProperty prop)
          Method to add a property setter.
 Object deserialize(JsonParser jp, DeserializationContext ctxt)
          Main deserialization method for bean-based objects (POJOs).
 Object deserialize(JsonParser jp, DeserializationContext ctxt, Object bean)
          Secondary deserialization method, called in cases where POJO instance is created as part of deserialization, potentially after collecting some or all of the properties to set.
 Object deserializeFromNumber(JsonParser jp, DeserializationContext ctxt)
           
 Object deserializeFromObject(JsonParser jp, DeserializationContext ctxt)
           
 Object deserializeFromString(JsonParser jp, DeserializationContext ctxt)
           
 Object deserializeUsingCreator(JsonParser jp, DeserializationContext ctxt)
           
 Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer)
          Base implementation that does not assume specific type inclusion mechanism.
 SettableBeanProperty findBackReference(String logicalName)
          Method needed by BeanDeserializerFactory to properly link managed- and back-reference pairs.
 Class<?> getBeanClass()
           
 JavaType getValueType()
          Exact structured type deserializer handles, if known.
protected  Object handlePolymorphic(JsonParser jp, DeserializationContext ctxt, Object bean, TokenBuffer unknownTokens)
          Method called in cases where we may have polymorphic deserialization case: that is, type of Creator-constructed bean is not the type of deserializer itself.
protected  Object handleUnknownProperties(DeserializationContext ctxt, Object bean, TokenBuffer unknownTokens)
          Method called to handle set of one or more unknown properties, stored in their entirety in given TokenBuffer (as field entries, name and value).
protected  void handleUnknownProperty(JsonParser jp, DeserializationContext ctxt, Object beanOrClass, String propName)
          Method called when a JSON property is encountered that has not matching setter, any-setter or field, and thus can not be assigned.
 boolean hasProperty(String propertyName)
           
 Iterable<SettableBeanProperty> properties()
           
 SettableBeanProperty removeProperty(String name)
           
 void resolve(DeserializationConfig config, DeserializerProvider provider)
          Method called to finalize setup of this deserializer, after deserializer itself has been registered.
 void setAnySetter(SettableAnyProperty s)
           
 void setCreators(CreatorContainer creators)
          Method called by factory after it has introspected all available Creators (constructors, static factory methods).
 void setDefaultConstructor(Constructor<?> ctor)
           
 void setIgnoreUnknownProperties(boolean ignore)
           
 void wrapAndThrow(Throwable t, Object bean, int index)
           
 void wrapAndThrow(Throwable t, Object bean, String fieldName)
          Method that will modify caught exception (passed in as argument) as necessary to include reference information, and to ensure it is a subtype of IOException, or an unchecked exception.
 
Methods inherited from class org.codehaus.jackson.map.deser.StdDeserializer
_parseBoolean, _parseDate, _parseDouble, _parseDoublePrimitive, _parseFloat, _parseFloatPrimitive, _parseInteger, _parseIntPrimitive, _parseLong, _parseLongPrimitive, _parseShort, _parseShortPrimitive, findDeserializer, getValueClass, reportUnknownProperty
 
Methods inherited from class org.codehaus.jackson.map.JsonDeserializer
getNullValue
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

_beanType

protected final JavaType _beanType
Declared type of the bean this deserializer handles.


_defaultConstructor

protected Constructor<?> _defaultConstructor
Default constructor used to instantiate the bean when mapping from Json object, and only using setters for initialization (not specific constructors).

Note: may be null, if deserializer is constructed for abstract types (which is only useful if additional type information will allow construction of concrete subtype).


_stringCreator

protected org.codehaus.jackson.map.deser.Creator.StringBased _stringCreator
If the "bean" class can be instantiated using just a single String (via constructor, static method etc), this object knows how to invoke method/constructor in question. If so, no setters will be used.


_numberCreator

protected org.codehaus.jackson.map.deser.Creator.NumberBased _numberCreator
If the "bean" class can be instantiated using just a single numeric (int, long) value (via constructor, static method etc), this object knows how to invoke method/constructor in question. If so, no setters will be used.


_delegatingCreator

protected org.codehaus.jackson.map.deser.Creator.Delegating _delegatingCreator
If the bean class can be instantiated using a creator (an annotated single arg constructor or static method), this object is used for handling details of how delegate-based deserialization and instance construction works


_propertyBasedCreator

protected org.codehaus.jackson.map.deser.Creator.PropertyBased _propertyBasedCreator
If the bean needs to be instantiated using constructor or factory method that takes one or more named properties as argument(s), this creator is used for instantiation.


_props

protected final HashMap<String,SettableBeanProperty> _props
Things set via setters (modifiers) are included in this Map.


_anySetter

protected SettableAnyProperty _anySetter
Fallback setter used for handling any properties that are not mapped to regular setters. If setter is not null, it will be called once for each such property.


_ignorableProps

protected HashSet<String> _ignorableProps
In addition to properties that are set, we will also keep track of recognized but ignorable properties: these will be skipped without errors or warnings.


_ignoreAllUnknown

protected boolean _ignoreAllUnknown
Flag that can be set to ignore and skip unknown properties. If set, will not throw an exception for unknown properties.


_backRefs

protected HashMap<String,SettableBeanProperty> _backRefs
We may also have one or more back reference fields (usually zero or one).


_subDeserializers

protected HashMap<ClassKey,JsonDeserializer<Object>> _subDeserializers
Lazily constructed map used to contain deserializers needed for polymorphic subtypes.

Constructor Detail

BeanDeserializer

public BeanDeserializer(JavaType type)
Method Detail

setDefaultConstructor

public void setDefaultConstructor(Constructor<?> ctor)

setCreators

public void setCreators(CreatorContainer creators)
Method called by factory after it has introspected all available Creators (constructors, static factory methods).


addProperty

public void addProperty(SettableBeanProperty prop)
Method to add a property setter. Will ensure that there is no unexpected override; if one is found will throw a IllegalArgumentException.


hasProperty

public boolean hasProperty(String propertyName)
Since:
1.6

addBackReferenceProperty

public void addBackReferenceProperty(String referenceName,
                                     SettableBeanProperty prop)

removeProperty

public SettableBeanProperty removeProperty(String name)

setAnySetter

public void setAnySetter(SettableAnyProperty s)

setIgnoreUnknownProperties

public void setIgnoreUnknownProperties(boolean ignore)

addIgnorable

public void addIgnorable(String propName)
Method that will add property name as one of properties that can be ignored if not recognized.


resolve

public void resolve(DeserializationConfig config,
                    DeserializerProvider provider)
             throws JsonMappingException
Method called to finalize setup of this deserializer, after deserializer itself has been registered. This is needed to handle recursive and transitive dependencies.

Specified by:
resolve in interface ResolvableDeserializer
provider - Provider that has constructed deserializer this method is called on.
Throws:
JsonMappingException

deserialize

public final Object deserialize(JsonParser jp,
                                DeserializationContext ctxt)
                         throws IOException,
                                JsonProcessingException
Main deserialization method for bean-based objects (POJOs).

Specified by:
deserialize in class JsonDeserializer<Object>
Parameters:
jp - Parsed used for reading Json content
ctxt - Context that can be used to access information about this deserialization activity.
Returns:
Deserializer value
Throws:
IOException
JsonProcessingException

deserialize

public Object deserialize(JsonParser jp,
                          DeserializationContext ctxt,
                          Object bean)
                   throws IOException,
                          JsonProcessingException
Secondary deserialization method, called in cases where POJO instance is created as part of deserialization, potentially after collecting some or all of the properties to set.

Overrides:
deserialize in class JsonDeserializer<Object>
Throws:
IOException
JsonProcessingException

deserializeWithType

public Object deserializeWithType(JsonParser jp,
                                  DeserializationContext ctxt,
                                  TypeDeserializer typeDeserializer)
                           throws IOException,
                                  JsonProcessingException
Description copied from class: StdDeserializer
Base implementation that does not assume specific type inclusion mechanism. Sub-classes are expected to override this method if they are to handle type information.

Overrides:
deserializeWithType in class StdDeserializer<Object>
typeDeserializer - Deserializer to use for handling type information
Throws:
IOException
JsonProcessingException

getBeanClass

public final Class<?> getBeanClass()

getValueType

public JavaType getValueType()
Description copied from class: StdDeserializer
Exact structured type deserializer handles, if known.

Default implementation just returns null.

Overrides:
getValueType in class StdDeserializer<Object>

properties

public Iterable<SettableBeanProperty> properties()
Since:
1.6

findBackReference

public SettableBeanProperty findBackReference(String logicalName)
Method needed by BeanDeserializerFactory to properly link managed- and back-reference pairs.


deserializeFromObject

public Object deserializeFromObject(JsonParser jp,
                                    DeserializationContext ctxt)
                             throws IOException,
                                    JsonProcessingException
Throws:
IOException
JsonProcessingException

deserializeFromString

public Object deserializeFromString(JsonParser jp,
                                    DeserializationContext ctxt)
                             throws IOException,
                                    JsonProcessingException
Throws:
IOException
JsonProcessingException

deserializeFromNumber

public Object deserializeFromNumber(JsonParser jp,
                                    DeserializationContext ctxt)
                             throws IOException,
                                    JsonProcessingException
Throws:
IOException
JsonProcessingException

deserializeUsingCreator

public Object deserializeUsingCreator(JsonParser jp,
                                      DeserializationContext ctxt)
                               throws IOException,
                                      JsonProcessingException
Throws:
IOException
JsonProcessingException

_deserializeUsingPropertyBased

protected final Object _deserializeUsingPropertyBased(JsonParser jp,
                                                      DeserializationContext ctxt)
                                               throws IOException,
                                                      JsonProcessingException
Method called to deserialize bean using "property-based creator": this means that a non-default constructor or factory method is called, and then possibly other setters. The trick is that values for creator method need to be buffered, first; and due to non-guaranteed ordering possibly some other properties as well.

Throws:
IOException
JsonProcessingException
Since:
1.2

handleUnknownProperty

protected void handleUnknownProperty(JsonParser jp,
                                     DeserializationContext ctxt,
                                     Object beanOrClass,
                                     String propName)
                              throws IOException,
                                     JsonProcessingException
Method called when a JSON property is encountered that has not matching setter, any-setter or field, and thus can not be assigned.

Overrides:
handleUnknownProperty in class StdDeserializer<Object>
Parameters:
jp - Parser that points to value of the unknown property
ctxt - Context for deserialization; allows access to the parser, error reporting functionality
beanOrClass - Instance that is being populated by this deserializer, or if not known, Class that would be instantiated. If null, will assume type is what StdDeserializer.getValueClass() returns.
propName - Name of the property that can not be mapped
Throws:
IOException
JsonProcessingException

handleUnknownProperties

protected Object handleUnknownProperties(DeserializationContext ctxt,
                                         Object bean,
                                         TokenBuffer unknownTokens)
                                  throws IOException,
                                         JsonProcessingException
Method called to handle set of one or more unknown properties, stored in their entirety in given TokenBuffer (as field entries, name and value).

Throws:
IOException
JsonProcessingException

handlePolymorphic

protected Object handlePolymorphic(JsonParser jp,
                                   DeserializationContext ctxt,
                                   Object bean,
                                   TokenBuffer unknownTokens)
                            throws IOException,
                                   JsonProcessingException
Method called in cases where we may have polymorphic deserialization case: that is, type of Creator-constructed bean is not the type of deserializer itself. It should be a sub-class or implementation class; either way, we may have more specific deserializer to use for handling it.

Parameters:
jp - (optional) If not null, parser that has more properties to handle (in addition to buffered properties); if null, all properties are passed in buffer
Throws:
IOException
JsonProcessingException

_findSubclassDeserializer

protected JsonDeserializer<Object> _findSubclassDeserializer(DeserializationContext ctxt,
                                                             Object bean,
                                                             TokenBuffer unknownTokens)
                                                      throws IOException,
                                                             JsonProcessingException
Helper method called to (try to) locate deserializer for given sub-type of type that this deserializer handles.

Throws:
IOException
JsonProcessingException

wrapAndThrow

public void wrapAndThrow(Throwable t,
                         Object bean,
                         String fieldName)
                  throws IOException
Method that will modify caught exception (passed in as argument) as necessary to include reference information, and to ensure it is a subtype of IOException, or an unchecked exception.

Rules for wrapping and unwrapping are bit complicated; essentially:

Throws:
IOException

wrapAndThrow

public void wrapAndThrow(Throwable t,
                         Object bean,
                         int index)
                  throws IOException
Throws:
IOException