General data-binding functionality for Jackson: works on core streaming API
—
Jackson's deserialization framework provides a flexible and extensible system for converting JSON to Java objects. The framework is built around JsonDeserializer implementations, DeserializationContext for processing context, and various factory and configuration classes that control the deserialization process.
JsonDeserializer is the abstract base class for all deserializers that convert JSON to Java objects.
public abstract class JsonDeserializer<T> {
// Core deserialization method
public abstract T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException;
// Type-aware deserialization (for polymorphic types)
public T deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException;
// Null and empty value handling
public T getNullValue(DeserializationContext ctxt) throws JsonMappingException;
public T getEmptyValue(DeserializationContext ctxt) throws JsonMappingException;
public AccessPattern getNullAccessPattern();
public AccessPattern getEmptyAccessPattern();
// Missing value handling (for creator parameters)
public Object getAbsentValue(DeserializationContext ctxt) throws JsonMappingException;
// Metadata methods
public Class<?> handledType();
public LogicalType logicalType();
public boolean isCachable();
public JsonDeserializer<?> getDelegatee();
public Collection<Object> getKnownPropertyNames();
// Object identity support
public ObjectIdReader getObjectIdReader();
// Contextual deserialization
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
// Resolution support
public void resolve(DeserializationContext ctxt) throws JsonMappingException;
// Replacement support
public JsonDeserializer<?> replaceDelegatee(JsonDeserializer<?> delegatee);
// Unwrapping support (for @JsonUnwrapped)
public boolean isUnwrappingDeserializer();
public JsonDeserializer<T> unwrappingDeserializer(NameTransformer unwrapper);
// Update support (for merging/updating existing objects)
public SettableBeanProperty findBackReference(String refName);
public Boolean supportsUpdate(DeserializationConfig config);
// Marker classes for None values
public static abstract class None extends JsonDeserializer<Object> { }
}DeserializationContext provides context and utility methods for deserializers during the deserialization process.
public abstract class DeserializationContext extends DatabindContext {
// Value reading
public abstract Object readValue(JsonParser p, JavaType valueType) throws IOException;
public abstract Object readValue(JsonParser p, Class<?> valueType) throws IOException;
public abstract Object readPropertyValue(JsonParser p, BeanProperty prop, JavaType valueType) throws IOException;
public abstract Object readPropertyValue(JsonParser p, BeanProperty prop, Class<?> valueType) throws IOException;
// Deserializer lookup
public abstract JsonDeserializer<Object> findContextualValueDeserializer(JavaType type, BeanProperty prop) throws JsonMappingException;
public abstract JsonDeserializer<Object> findKeyDeserializer(JavaType keyType, BeanProperty prop) throws JsonMappingException;
public final JsonDeserializer<Object> findRootValueDeserializer(JavaType valueType) throws JsonMappingException;
// Null value providers
public abstract JsonDeserializer<Object> findNullValueDeserializer(BeanProperty prop) throws JsonMappingException;
// Object construction
public abstract Object leaseObjectBuffer();
public abstract void returnObjectBuffer(Object buf);
public abstract Object[] leaseObjectBuffer(int minSize);
public abstract void returnObjectBuffer(Object[] buf);
// Parser utilities
public JsonParser getParser();
public final JsonLocation getCurrentLocation();
public final JsonToken getCurrentToken();
public final JsonStreamContext getParsingContext();
// Problem handling
public abstract void reportWrongTokenException(JavaType targetType, JsonToken expToken, String msg, Object... msgArgs) throws JsonMappingException;
public abstract void reportMissingContent(String msg, Object... msgArgs) throws JsonMappingException;
public abstract Object reportInputMismatch(BeanProperty prop, String msg, Object... msgArgs) throws JsonMappingException;
public abstract Object reportInputMismatch(Class<?> targetType, String msg, Object... msgArgs) throws JsonMappingException;
public abstract Object reportInputMismatch(JavaType targetType, String msg, Object... msgArgs) throws JsonMappingException;
public abstract Object reportBadCoercion(JsonDeserializer<?> src, Class<?> targetType, Object inputValue, String msg, Object... msgArgs) throws JsonMappingException;
public abstract JsonMappingException wrongTokenException(JsonParser p, JavaType targetType, JsonToken expToken, String extra) throws JsonMappingException;
public abstract JsonMappingException weirdStringException(String value, Class<?> instClass, String msgFormat, Object... msgArgs) throws JsonMappingException;
public abstract JsonMappingException weirdNumberException(Number value, Class<?> instClass, String msg) throws JsonMappingException;
public abstract JsonMappingException weirdKeyException(Class<?> keyClass, String keyValue, String msg) throws JsonMappingException;
public abstract JsonMappingException instantiationException(Class<?> instClass, Throwable cause) throws JsonMappingException;
public abstract JsonMappingException instantiationException(Class<?> instClass, String msg) throws JsonMappingException;
public abstract JsonMappingException invalidTypeIdException(JavaType baseType, String typeId, String extraDesc) throws JsonMappingException;
public abstract JsonMappingException missingTypeIdException(JavaType baseType, String extraDesc) throws JsonMappingException;
// Unknown property handling
public abstract boolean handleUnknownProperty(JsonParser p, JsonDeserializer<?> deser, Object instanceOrClass, String propName) throws IOException;
// Ignorable types
public abstract boolean isEnabled(DeserializationFeature feat);
public final boolean isEnabled(MapperFeature feat);
public final boolean isEnabled(JsonParser.Feature feat);
// Configuration access
public abstract DeserializationConfig getConfig();
// View support
public final Class<?> getActiveView();
// Locale and timezone
public final Locale getLocale();
public final TimeZone getTimeZone();
// Date format
public final DateFormat getDateFormat();
// Attributes
public abstract Object getAttribute(Object key);
public abstract DeserializationContext setAttribute(Object key, Object value);
// Type factory
public final TypeFactory getTypeFactory();
// Object construction utilities
public Class<?> findClass(String className) throws ClassNotFoundException;
// Coercion
public CoercionAction findCoercionAction(LogicalType logicalType, Class<?> rawTargetType, CoercionInputShape inputShape);
public CoercionAction findCoercionFromBlankString(LogicalType logicalType, Class<?> rawTargetType, CoercionAction actionIfBlankNotAllowed);
// Array handling
public final boolean hasSomeOfFeatures(int featureMask);
// Object identity
public abstract ReadableObjectId findObjectId(Object id, ObjectIdGenerator<?> generator, ObjectIdResolver resolver);
public abstract void checkUnresolvedObjectId() throws UnresolvedForwardReference;
// Buffer management for arrays
public final ObjectBuffer leaseObjectBuffer();
public final void returnObjectBuffer(ObjectBuffer buf);
// String building
public StringBuilder constructStringBuilder();
public String constructString();
// Number parsing
public final int extractScalarFromObject(JsonParser p, JsonDeserializer<?> deser, Class<?> scalarType) throws IOException;
}Jackson provides standard deserializers for common Java types.
public abstract class StdDeserializer<T> extends JsonDeserializer<T> implements Serializable {
// Construction
protected StdDeserializer(Class<?> vc);
protected StdDeserializer(JavaType valueType);
protected StdDeserializer(StdDeserializer<?> src);
// Type information
public Class<?> handledType();
public JavaType getValueType();
public JavaType getValueType(DeserializationContext ctxt);
// Value extraction utilities
protected final boolean _parseBooleanPrimitive(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Boolean _parseBoolean(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Boolean _parseBoolean(JsonParser p, DeserializationContext ctxt, Class<?> targetType) throws IOException;
protected final int _parseIntPrimitive(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Integer _parseInteger(JsonParser p, DeserializationContext ctxt, Class<?> targetType) throws IOException;
protected final long _parseLongPrimitive(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Long _parseLong(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Long _parseLong(JsonParser p, DeserializationContext ctxt, Class<?> targetType) throws IOException;
protected final float _parseFloatPrimitive(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Float _parseFloat(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final double _parseDoublePrimitive(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Double _parseDouble(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Date _parseDate(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final String _parseString(JsonParser p, DeserializationContext ctxt) throws IOException;
// String coercion utilities
protected T _deserializeFromString(JsonParser p, DeserializationContext ctxt) throws IOException;
protected T _deserializeFromArray(JsonParser p, DeserializationContext ctxt) throws IOException;
protected T _deserializeWrappedValue(JsonParser p, DeserializationContext ctxt) throws IOException;
// Exception handling utilities
protected JsonMappingException wrapAndThrow(Throwable t, Object ref, String fieldName) throws JsonMappingException;
protected JsonMappingException wrapAndThrow(Throwable t, Object ref, int index) throws JsonMappingException;
// Null handling
protected void handleUnknownProperty(JsonParser p, DeserializationContext ctxt, Object instanceOrClass, String propName) throws IOException;
protected void handleMissingEndArrayForSingle(JsonParser p, DeserializationContext ctxt) throws IOException;
// Type checking
protected final boolean _hasTextualNull(String value);
protected final boolean _isEmptyOrTextualNull(String value);
protected final boolean _isNegInf(String text);
protected final boolean _isPosInf(String text);
protected final boolean _isNaN(String text);
// Coercion support
protected Object _coerceEmptyString(DeserializationContext ctxt, boolean isEmpty) throws JsonMappingException;
protected Object _coerceTextualNull(DeserializationContext ctxt, boolean isPrimitive) throws JsonMappingException;
protected Object _coerceIntegral(JsonParser p, DeserializationContext ctxt) throws IOException;
protected Object _coerceTextualNull(DeserializationContext ctxt, boolean isPrimitive) throws JsonMappingException;
// Logging
protected void _reportFailedNullCoerce(DeserializationContext ctxt, boolean state, Enum<?> feature, String inputDesc) throws JsonMappingException;
}
// Scalar deserializers
public abstract class StdScalarDeserializer<T> extends StdDeserializer<T> {
protected StdScalarDeserializer(Class<?> vc);
protected StdScalarDeserializer(JavaType valueType);
protected StdScalarDeserializer(StdScalarDeserializer<?> src);
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException;
public abstract LogicalType logicalType();
}// Collection deserializer
public class CollectionDeserializer extends ContainerDeserializerBase<Collection<Object>> implements ContextualDeserializer {
// Construction
public CollectionDeserializer(JavaType collectionType, JsonDeserializer<Object> valueDeser, TypeDeserializer valueTypeDeser, ValueInstantiator valueInstantiator);
public CollectionDeserializer(JavaType collectionType, JsonDeserializer<Object> valueDeser, TypeDeserializer valueTypeDeser, ValueInstantiator valueInstantiator, JsonDeserializer<Object> delegateDeser);
// Contextualization
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
// Deserialization
public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException;
public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt, Collection<Object> result) throws IOException;
// Value instantiation
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException;
// Type information
public JavaType getContentType();
public JsonDeserializer<Object> getContentDeserializer();
// Logical type
public LogicalType logicalType();
// Null/empty handling
public boolean isCachable();
// Support methods
public Collection<Object> handleNonArray(JsonParser p, DeserializationContext ctxt, Collection<Object> result) throws IOException;
}
// Array deserializer
public class ObjectArrayDeserializer extends ContainerDeserializerBase<Object[]> implements ContextualDeserializer {
// Construction
public ObjectArrayDeserializer(JavaType arrayType, JsonDeserializer<Object> elemDeser, TypeDeserializer elemTypeDeser);
// Contextualization
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
// Deserialization
public Object[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException;
public Object[] deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException;
// Content type
public JavaType getContentType();
public JsonDeserializer<Object> getContentDeserializer();
// Logical type
public LogicalType logicalType();
}
// Map deserializer
public class MapDeserializer extends ContainerDeserializerBase<Map<Object, Object>> implements ContextualDeserializer, ResolvableDeserializer {
// Construction
public MapDeserializer(JavaType mapType, ValueInstantiator valueInstantiator, KeyDeserializer keyDeser, JsonDeserializer<Object> valueDeser, TypeDeserializer valueTypeDeser);
// Contextualization
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
// Resolution
public void resolve(DeserializationContext ctxt) throws JsonMappingException;
// Deserialization
public Map<Object, Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException;
public Map<Object, Object> deserialize(JsonParser p, DeserializationContext ctxt, Map<Object, Object> result) throws IOException;
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException;
// Content information
public JavaType getContentType();
public JsonDeserializer<Object> getContentDeserializer();
// Key information
public KeyDeserializer getKeyDeserializer();
// Logical type
public LogicalType logicalType();
// Support methods
protected void wrapAndThrow(Throwable t, Object ref, String fieldName) throws JsonMappingException;
}public class BeanDeserializer extends BeanDeserializerBase implements Serializable {
// Construction
public BeanDeserializer(BeanDeserializerBuilder builder, BeanDescription beanDesc, BeanPropertyMap properties, Map<String, SettableBeanProperty> backRefs, HashSet<String> ignorableProps, boolean ignoreAllUnknown, Set<String> includableProps, boolean hasViews);
protected BeanDeserializer(BeanDeserializerBase src);
protected BeanDeserializer(BeanDeserializerBase src, boolean ignoreAllUnknown);
protected BeanDeserializer(BeanDeserializerBase src, NameTransformer unwrapper);
protected BeanDeserializer(BeanDeserializerBase src, ObjectIdReader oir);
protected BeanDeserializerBase(BeanDeserializerBase src, Set<String> ignorableProps);
protected BeanDeserializer(BeanDeserializerBase src, BeanPropertyMap props);
// Deserialization
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException;
public Object deserialize(JsonParser p, DeserializationContext ctxt, Object bean) throws IOException;
// Deserialization from different structures
protected Object _deserializeUsingPropertyBased(JsonParser p, DeserializationContext ctxt) throws IOException;
public Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException;
protected Object _deserializeFromArray(JsonParser p, DeserializationContext ctxt) throws IOException;
protected final Object _deserializeFromString(JsonParser p, DeserializationContext ctxt) throws IOException;
protected Object _deserializeFromNumber(JsonParser p, DeserializationContext ctxt) throws IOException;
protected Object _deserializeOther(JsonParser p, DeserializationContext ctxt, JsonToken t) throws IOException;
// Unwrapping support
public JsonDeserializer<Object> unwrappingDeserializer(NameTransformer unwrapper);
// Replacement
public BeanDeserializer withObjectIdReader(ObjectIdReader oir);
public BeanDeserializer withByNameInclusion(Set<String> ignorableProps, Set<String> includableProps);
public BeanDeserializerBase withIgnoreAllUnknown(boolean ignoreUnknown);
public BeanDeserializerBase withBeanProperties(BeanPropertyMap props);
// Support methods
protected Object deserializeWithView(JsonParser p, DeserializationContext ctxt, Object bean, Class<?> activeView) throws IOException;
protected Object deserializeWithExternalTypeId(JsonParser p, DeserializationContext ctxt) throws IOException;
protected Object deserializeWithExternalTypeId(JsonParser p, DeserializationContext ctxt, Object bean) throws IOException;
}
public abstract class BeanDeserializerBase extends StdDeserializer<Object> implements ContextualDeserializer, ResolvableDeserializer, Serializable {
// Bean metadata
protected final JavaType _beanType;
protected final BeanPropertyMap _beanProperties;
protected final ValueInstantiator _valueInstantiator;
// Special properties
protected JsonDeserializer<Object> _delegateDeserializer;
protected JsonDeserializer<Object> _arrayDelegateDeserializer;
protected PropertyBasedCreator _propertyBasedCreator;
protected boolean _nonStandardCreation;
protected boolean _vanillaProcessing;
// Ignored and external properties
protected final Set<String> _ignorableProps;
protected final boolean _ignoreAllUnknown;
protected final Set<String> _includableProps;
protected SettableAnyProperty _anySetter;
protected final Map<String, SettableBeanProperty> _backRefs;
// View support
protected final boolean _hasViews;
// Object identity
protected final ObjectIdReader _objectIdReader;
// External type handling
protected ExternalTypeHandler _externalTypeIdHandler;
// Deserialization methods
public abstract Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException;
public abstract Object deserialize(JsonParser p, DeserializationContext ctxt, Object bean) throws IOException;
public abstract Object deserializeFromObject(JsonParser p, DeserializationContext ctxt) throws IOException;
// Metadata access
public Class<?> getBeanClass();
public JavaType getValueType();
public Iterator<SettableBeanProperty> properties();
public boolean hasProperty(String propertyName);
public SettableBeanProperty findProperty(String propertyName);
public SettableBeanProperty findProperty(int propertyIndex);
// Replacement methods
public abstract JsonDeserializer<Object> unwrappingDeserializer(NameTransformer unwrapper);
public abstract BeanDeserializerBase withObjectIdReader(ObjectIdReader oir);
public abstract BeanDeserializerBase withIgnoreAllUnknown(boolean ignoreUnknown);
public abstract BeanDeserializerBase withBeanProperties(BeanPropertyMap props);
public abstract BeanDeserializerBase withByNameInclusion(Set<String> ignorableProps, Set<String> includableProps);
// Contextualization and resolution
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
public void resolve(DeserializationContext ctxt) throws JsonMappingException;
// Unknown property handling
protected void handleUnknownProperty(JsonParser p, DeserializationContext ctxt, Object beanOrClass, String propName) throws IOException;
protected void handleUnknownVanilla(JsonParser p, DeserializationContext ctxt, Object bean, String propName) throws IOException;
protected void handleUnknownProperties(DeserializationContext ctxt, Object bean, TokenBuffer unknownTokens) throws IOException;
// Ignored properties
protected void handleIgnoredProperty(JsonParser p, DeserializationContext ctxt, Object beanOrClass, String propName) throws IOException;
// Type information
public LogicalType logicalType();
public boolean isCachable();
public Boolean supportsUpdate(DeserializationConfig config);
// Back reference support
public SettableBeanProperty findBackReference(String logicalName);
// Object identity
public ObjectIdReader getObjectIdReader();
// Exception creation
protected JsonMappingException wrapAndThrow(Throwable t, Object ref, String fieldName, DeserializationContext ctxt) throws JsonMappingException;
protected JsonMappingException wrapAndThrow(Throwable t, Object ref, int index, DeserializationContext ctxt) throws JsonMappingException;
}public abstract class SettableBeanProperty implements BeanProperty {
// Property metadata
protected final PropertyName _propName;
protected final JavaType _type;
protected final PropertyName _wrapperName;
protected final AnnotatedMember _member;
protected final Annotations _contextAnnotations;
// Deserialization
protected JsonDeserializer<Object> _valueDeserializer;
protected TypeDeserializer _valueTypeDeserializer;
protected NullValueProvider _nullProvider;
// Property index for faster access
protected final int _propertyIndex;
protected final int _creatorIndex;
// Views
protected Class<?>[] _includeInViews;
// Construction
protected SettableBeanProperty(BeanPropertyDefinition propDef, JavaType type, TypeDeserializer typeDeser, Annotations contextAnnotations);
protected SettableBeanProperty(PropertyName propName, JavaType type, PropertyName wrapperName, TypeDeserializer typeDeser, Annotations contextAnnotations, PropertyMetadata metadata);
protected SettableBeanProperty(SettableBeanProperty src, JsonDeserializer<?> deser);
protected SettableBeanProperty(SettableBeanProperty src, PropertyName newName);
// Abstract methods
public abstract void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object instance) throws IOException;
public abstract Object deserializeSetAndReturn(JsonParser p, DeserializationContext ctxt, Object instance) throws IOException;
public abstract void set(Object instance, Object value) throws IOException;
public abstract Object setAndReturn(Object instance, Object value) throws IOException;
// Replacement methods
public abstract SettableBeanProperty withName(PropertyName newName);
public abstract SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser);
public abstract SettableBeanProperty withNullProvider(NullValueProvider nva);
// Assignment
public void assignIndex(int index);
public void setViews(Class<?>[] views);
public void fixAccess(DeserializationConfig config);
// Metadata access
public final String getName();
public PropertyName getFullName();
public JavaType getType();
public PropertyName getWrapperName();
public AnnotatedMember getMember();
public <A extends Annotation> A getAnnotation(Class<A> acls);
public <A extends Annotation> A getContextAnnotation(Class<A> acls);
// Deserialization access
public JsonDeserializer<Object> getValueDeserializer();
public TypeDeserializer getValueTypeDeserializer();
// View support
public boolean visibleInView(Class<?> activeView);
public boolean hasViews();
// Property index
public int getPropertyIndex();
public int getCreatorIndex();
// Metadata
public PropertyMetadata getMetadata();
public boolean isRequired();
public boolean isInjectionOnly();
// Value providers
public NullValueProvider getNullValueProvider();
// String representation
public String toString();
}public abstract class DeserializerFactory {
// Deserializer creation
public abstract JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException;
public abstract JsonDeserializer<Object> createBuilderBasedDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc, Class<?> builderClass) throws JsonMappingException;
// Array deserializers
public abstract JsonDeserializer<?> createArrayDeserializer(DeserializationContext ctxt, ArrayType type, BeanDescription beanDesc) throws JsonMappingException;
// Collection deserializers
public abstract JsonDeserializer<?> createCollectionDeserializer(DeserializationContext ctxt, CollectionType type, BeanDescription beanDesc) throws JsonMappingException;
public abstract JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationContext ctxt, CollectionLikeType type, BeanDescription beanDesc) throws JsonMappingException;
// Map deserializers
public abstract JsonDeserializer<?> createMapDeserializer(DeserializationContext ctxt, MapType type, BeanDescription beanDesc) throws JsonMappingException;
public abstract JsonDeserializer<?> createMapLikeDeserializer(DeserializationContext ctxt, MapLikeType type, BeanDescription beanDesc) throws JsonMappingException;
// Enum deserializers
public abstract JsonDeserializer<?> createEnumDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException;
// Tree deserializer
public abstract JsonDeserializer<?> createTreeDeserializer(DeserializationConfig config, JavaType nodeType, BeanDescription beanDesc) throws JsonMappingException;
// Reference type deserializers
public abstract JsonDeserializer<?> createReferenceDeserializer(DeserializationContext ctxt, ReferenceType type, BeanDescription beanDesc) throws JsonMappingException;
// Type deserializers
public abstract TypeDeserializer findTypeDeserializer(DeserializationConfig config, JavaType baseType) throws JsonMappingException;
// Key deserializers
public abstract KeyDeserializer createKeyDeserializer(DeserializationContext ctxt, JavaType type) throws JsonMappingException;
// Configuration
public abstract DeserializerFactory withAdditionalDeserializers(Deserializers additional);
public abstract DeserializerFactory withAdditionalKeyDeserializers(KeyDeserializers additional);
public abstract DeserializerFactory withDeserializerModifier(BeanDeserializerModifier modifier);
public abstract DeserializerFactory withAbstractTypeResolver(AbstractTypeResolver resolver);
public abstract DeserializerFactory withValueInstantiators(ValueInstantiators instantiators);
public abstract DeserializerFactory withConfig(DeserializationConfig config);
}
public class BeanDeserializerFactory extends BasicDeserializerFactory implements Serializable {
// Singleton instance
public static final BeanDeserializerFactory instance;
// Construction
public BeanDeserializerFactory(DeserializerFactoryConfig config);
// Factory methods
public DeserializerFactory withConfig(DeserializationConfig config);
public DeserializerFactory withAdditionalDeserializers(Deserializers additional);
public DeserializerFactory withAdditionalKeyDeserializers(KeyDeserializers additional);
public DeserializerFactory withDeserializerModifier(BeanDeserializerModifier modifier);
public DeserializerFactory withAbstractTypeResolver(AbstractTypeResolver resolver);
public DeserializerFactory withValueInstantiators(ValueInstantiators instantiators);
// Bean deserializer creation
public JsonDeserializer<Object> createBeanDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException;
public JsonDeserializer<Object> buildBeanDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException;
protected JsonDeserializer<Object> constructBeanDeserializer(DeserializationContext ctxt, BeanDescription beanDesc) throws JsonMappingException;
// Builder-based deserializers
public JsonDeserializer<Object> createBuilderBasedDeserializer(DeserializationContext ctxt, JavaType valueType, BeanDescription beanDesc, Class<?> builderClass) throws JsonMappingException;
// Property handling
protected void addBeanProps(DeserializationContext ctxt, BeanDescription beanDesc, BeanDeserializerBuilder builder) throws JsonMappingException;
protected List<SettableBeanProperty> filterBeanProps(DeserializationContext ctxt, BeanDescription beanDesc, BeanDeserializerBuilder builder, List<BeanPropertyDefinition> propDefs, Set<String> ignored) throws JsonMappingException;
protected SettableBeanProperty constructSettableProperty(DeserializationContext ctxt, BeanDescription beanDesc, BeanPropertyDefinition propDef, JavaType propType0) throws JsonMappingException;
protected SettableBeanProperty constructSetterlessProperty(DeserializationContext ctxt, BeanDescription beanDesc, BeanPropertyDefinition propDef) throws JsonMappingException;
// Creator handling
protected void addObjectIdReader(DeserializationContext ctxt, BeanDescription beanDesc, BeanDeserializerBuilder builder) throws JsonMappingException;
protected PropertyBasedCreator _constructPropertyBasedCreator(DeserializationContext ctxt, BeanDescription beanDesc, boolean visibilityForCreators, AnnotationIntrospector intr, CreatorCollector creators) throws JsonMappingException;
}import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
// Custom deserializer for Person class
public class PersonDeserializer extends StdDeserializer<Person> {
public PersonDeserializer() {
this(null);
}
public PersonDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Person deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken token = p.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
String firstName = null;
String lastName = null;
Integer age = null;
Date birthDate = null;
while (p.nextToken() != JsonToken.END_OBJECT) {
String fieldName = p.getCurrentName();
p.nextToken();
switch (fieldName) {
case "fullName":
// Handle "John Doe" format
String fullName = p.getText();
String[] parts = fullName.split(" ", 2);
firstName = parts[0];
lastName = parts.length > 1 ? parts[1] : "";
break;
case "firstName":
firstName = p.getText();
break;
case "lastName":
lastName = p.getText();
break;
case "age":
age = p.getIntValue();
break;
case "birthDate":
// Custom date parsing
String dateStr = p.getText();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
birthDate = sdf.parse(dateStr);
} catch (ParseException e) {
throw new JsonProcessingException("Invalid date format: " + dateStr, p.getCurrentLocation(), e);
}
break;
default:
// Skip unknown properties or handle them
p.skipChildren();
break;
}
}
// Validation
if (firstName == null) {
throw new JsonMappingException(p, "firstName is required");
}
return new Person(firstName, lastName, age, birthDate);
} else if (token == JsonToken.VALUE_STRING) {
// Handle string format like "John Doe,30"
String value = p.getText();
String[] parts = value.split(",");
if (parts.length >= 1) {
String[] nameParts = parts[0].split(" ", 2);
String firstName = nameParts[0];
String lastName = nameParts.length > 1 ? nameParts[1] : "";
Integer age = parts.length > 1 ? Integer.parseInt(parts[1].trim()) : null;
return new Person(firstName, lastName, age, null);
}
}
throw new JsonMappingException(p, "Cannot deserialize Person from " + token);
}
// Handle type information for polymorphic deserialization
@Override
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException {
return typeDeserializer.deserializeTypedFromObject(p, ctxt);
}
// Provide null value
@Override
public Person getNullValue(DeserializationContext ctxt) {
return new Person("Unknown", "", 0, null);
}
}
// Register with ObjectMapper
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Person.class, new PersonDeserializer());
mapper.registerModule(module);
// Use
String json = "{\"fullName\":\"John Doe\",\"age\":30}";
Person person = mapper.readValue(json, Person.class);// Contextual deserializer that adapts based on annotations
public class ConfigurableStringDeserializer extends StdDeserializer<String> implements ContextualDeserializer {
private final boolean upperCase;
private final boolean trim;
private final String defaultValue;
public ConfigurableStringDeserializer() {
this(false, false, null);
}
private ConfigurableStringDeserializer(boolean upperCase, boolean trim, String defaultValue) {
super(String.class);
this.upperCase = upperCase;
this.trim = trim;
this.defaultValue = defaultValue;
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
if (property != null) {
StringFormat ann = property.getAnnotation(StringFormat.class);
if (ann != null) {
return new ConfigurableStringDeserializer(
ann.upperCase(),
ann.trim(),
ann.defaultValue().isEmpty() ? null : ann.defaultValue()
);
}
}
return this;
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (value == null || value.isEmpty()) {
return defaultValue;
}
if (trim) {
value = value.trim();
}
if (upperCase) {
value = value.toUpperCase();
}
return value;
}
@Override
public String getNullValue(DeserializationContext ctxt) {
return defaultValue;
}
}
// Custom annotation
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface StringFormat {
boolean upperCase() default false;
boolean trim() default true;
String defaultValue() default "";
}
// Usage in POJO
public class UserData {
@StringFormat(upperCase = true, trim = true)
private String username;
@StringFormat(trim = true, defaultValue = "Unknown")
private String displayName;
// getters/setters
}// Custom collection deserializer
public class DelimitedStringListDeserializer extends StdDeserializer<List<String>> {
private final String delimiter;
public DelimitedStringListDeserializer(String delimiter) {
super(List.class);
this.delimiter = delimiter;
}
@Override
public List<String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken token = p.getCurrentToken();
if (token == JsonToken.VALUE_STRING) {
// Parse delimited string
String value = p.getText();
if (value == null || value.isEmpty()) {
return new ArrayList<>();
}
return Arrays.asList(value.split(Pattern.quote(delimiter)));
} else if (token == JsonToken.START_ARRAY) {
// Standard array parsing
List<String> result = new ArrayList<>();
while (p.nextToken() != JsonToken.END_ARRAY) {
result.add(p.getValueAsString());
}
return result;
}
throw new JsonMappingException(p, "Expected string or array for delimited list");
}
@Override
public List<String> getNullValue(DeserializationContext ctxt) {
return new ArrayList<>();
}
}
// Custom map deserializer that handles both object and array formats
public class FlexibleMapDeserializer extends StdDeserializer<Map<String, Object>> {
public FlexibleMapDeserializer() {
super(Map.class);
}
@Override
public Map<String, Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonToken token = p.getCurrentToken();
if (token == JsonToken.START_OBJECT) {
// Standard object format
Map<String, Object> result = new LinkedHashMap<>();
while (p.nextToken() != JsonToken.END_OBJECT) {
String key = p.getCurrentName();
p.nextToken();
Object value = ctxt.readValue(p, Object.class);
result.put(key, value);
}
return result;
} else if (token == JsonToken.START_ARRAY) {
// Array of key-value pairs: [["key1", "value1"], ["key2", "value2"]]
Map<String, Object> result = new LinkedHashMap<>();
while (p.nextToken() != JsonToken.END_ARRAY) {
if (p.getCurrentToken() == JsonToken.START_ARRAY) {
p.nextToken(); // key
String key = p.getValueAsString();
p.nextToken(); // value
Object value = ctxt.readValue(p, Object.class);
p.nextToken(); // END_ARRAY
result.put(key, value);
}
}
return result;
}
throw new JsonMappingException(p, "Expected object or array for flexible map");
}
}// Custom settable property for computed fields
public class ComputedSettableBeanProperty extends SettableBeanProperty {
private final BiConsumer<Object, Object> setter;
private final Function<String, Object> valueConverter;
public ComputedSettableBeanProperty(BeanPropertyDefinition propDef, JavaType type,
BiConsumer<Object, Object> setter,
Function<String, Object> valueConverter) {
super(propDef, type, null, null, null);
this.setter = setter;
this.valueConverter = valueConverter;
}
@Override
public void deserializeAndSet(JsonParser p, DeserializationContext ctxt, Object instance) throws IOException {
Object value = deserialize(p, ctxt);
if (value != null) {
setter.accept(instance, value);
}
}
@Override
public Object deserializeSetAndReturn(JsonParser p, DeserializationContext ctxt, Object instance) throws IOException {
deserializeAndSet(p, ctxt, instance);
return instance;
}
@Override
public void set(Object instance, Object value) throws IOException {
setter.accept(instance, value);
}
@Override
public Object setAndReturn(Object instance, Object value) throws IOException {
set(instance, value);
return instance;
}
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String stringValue = p.getValueAsString();
return valueConverter != null ? valueConverter.apply(stringValue) : stringValue;
}
@Override
public SettableBeanProperty withName(PropertyName newName) {
return this; // Immutable for simplicity
}
@Override
public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) {
return this; // Ignore for computed properties
}
@Override
public SettableBeanProperty withNullProvider(NullValueProvider nva) {
return this;
}
}
// Bean deserializer modifier to add computed properties
public class ComputedPropertiesDeserializerModifier extends BeanDeserializerModifier {
@Override
public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) {
Class<?> beanClass = beanDesc.getBeanClass();
if (beanClass == Person.class) {
// Add computed age from birthDate property
SimpleBeanPropertyDefinition ageFromBirthDate = SimpleBeanPropertyDefinition.construct(
config, null, new PropertyName("ageFromBirthDate"));
ComputedSettableBeanProperty computedProp = new ComputedSettableBeanProperty(
ageFromBirthDate,
config.getTypeFactory().constructType(Integer.class),
(person, dateStr) -> {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthDate = sdf.parse((String) dateStr);
long ageInMillis = System.currentTimeMillis() - birthDate.getTime();
int years = (int) (ageInMillis / (365.25 * 24 * 60 * 60 * 1000));
((Person) person).setAge(years);
} catch (Exception e) {
// Handle parsing errors
}
},
null // No conversion needed, handled in setter
);
builder.addProperty(computedProp);
}
return builder;
}
}// Deserializer with validation
public class ValidatedEmailDeserializer extends StdDeserializer<String> {
private static final Pattern EMAIL_PATTERN =
Pattern.compile("^[A-Za-z0-9+_.-]+@([A-Za-z0-9.-]+\\.[A-Za-z]{2,})$");
public ValidatedEmailDeserializer() {
super(String.class);
}
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String email = p.getValueAsString();
if (email == null || email.isEmpty()) {
throw new JsonMappingException(p, "Email cannot be null or empty");
}
if (!EMAIL_PATTERN.matcher(email).matches()) {
throw new JsonMappingException(p, "Invalid email format: " + email);
}
return email.toLowerCase(); // Normalize
}
@Override
public String getNullValue(DeserializationContext ctxt) throws JsonMappingException {
throw new JsonMappingException(ctxt.getParser(), "Email cannot be null");
}
}
// Problem handler for graceful error handling
public class LoggingDeserializationProblemHandler extends DeserializationProblemHandler {
private static final Logger logger = LoggerFactory.getLogger(LoggingDeserializationProblemHandler.class);
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
logger.warn("Unknown property '{}' in {}, skipping", propertyName, beanOrClass.getClass().getSimpleName());
p.skipChildren(); // Skip the value
return true; // Handled
}
@Override
public Object handleInstantiationProblem(DeserializationContext ctxt, Class<?> instClass, Object argument, Throwable t) throws IOException {
logger.error("Failed to instantiate {}", instClass.getSimpleName(), t);
// Return default instances for known types
if (instClass == Person.class) {
return new Person("Unknown", "", 0, null);
}
// Re-throw for unknown types
return NOT_HANDLED;
}
@Override
public Object handleMissingInstantiator(DeserializationContext ctxt, Class<?> instClass, ValueInstantiator valueInst, JsonParser p, String msg) throws IOException {
logger.warn("Missing instantiator for {}: {}", instClass.getSimpleName(), msg);
// Provide default constructor logic
try {
return instClass.getDeclaredConstructor().newInstance();
} catch (Exception e) {
return NOT_HANDLED;
}
}
}
// Usage
ObjectMapper mapper = new ObjectMapper();
mapper.addHandler(new LoggingDeserializationProblemHandler());
// Configure to be lenient with unknown properties
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);ObjectMapper mapper = new ObjectMapper();
// Configure deserialization features
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
// Multiple features at once
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);
mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,
DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
// Check feature status
boolean lenient = !mapper.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
boolean bigDecimals = mapper.isEnabled(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
// Configure through ObjectReader
ObjectReader reader = mapper.reader()
.without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.with(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
Person person = reader.readValue(jsonWithUnknownProps, Person.class);// Deserializer interfaces
public interface ContextualDeserializer {
JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException;
}
public interface ResolvableDeserializer {
void resolve(DeserializationContext ctxt) throws JsonMappingException;
}
// Key deserializer base
public abstract class KeyDeserializer {
public abstract Object deserializeKey(String key, DeserializationContext ctxt) throws IOException;
public static abstract class None extends KeyDeserializer { }
}
// Null value provider interface
public interface NullValueProvider {
Object getNullValue(DeserializationContext ctxt) throws JsonMappingException;
Object getAbsentValue(DeserializationContext ctxt) throws JsonMappingException;
AccessPattern getNullAccessPattern();
}
// Value instantiator for object creation
public abstract class ValueInstantiator {
// Default instantiation
public boolean canCreateUsingDefault();
public Object createUsingDefault(DeserializationContext ctxt) throws IOException;
// Delegate instantiation
public boolean canCreateUsingDelegate();
public Object createUsingDelegate(DeserializationContext ctxt, Object delegate) throws IOException;
public JavaType getDelegateType(DeserializationConfig config);
// Array delegate instantiation
public boolean canCreateUsingArrayDelegate();
public Object createUsingArrayDelegate(DeserializationContext ctxt, Object delegate) throws IOException;
public JavaType getArrayDelegateType(DeserializationConfig config);
// Scalar instantiation
public boolean canCreateFromString();
public Object createFromString(DeserializationContext ctxt, String value) throws IOException;
public boolean canCreateFromInt();
public Object createFromInt(DeserializationContext ctxt, int value) throws IOException;
public boolean canCreateFromLong();
public Object createFromLong(DeserializationContext ctxt, long value) throws IOException;
public boolean canCreateFromDouble();
public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException;
public boolean canCreateFromBoolean();
public Object createFromBoolean(DeserializationContext ctxt, boolean value) throws IOException;
// Properties-based instantiation
public boolean canCreateFromObjectWith();
public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) throws IOException;
public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config);
// Metadata
public String getValueTypeDesc();
}
// Deserializer registration interface
public interface Deserializers {
JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException;
JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType, DeserializationConfig config, BeanDescription beanDesc, TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer) throws JsonMappingException;
JsonDeserializer<?> findArrayDeserializer(ArrayType type, DeserializationConfig config, BeanDescription beanDesc, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) throws JsonMappingException;
JsonDeserializer<?> findCollectionDeserializer(CollectionType type, DeserializationConfig config, BeanDescription beanDesc, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) throws JsonMappingException;
JsonDeserializer<?> findCollectionLikeDeserializer(CollectionLikeType type, DeserializationConfig config, BeanDescription beanDesc, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) throws JsonMappingException;
JsonDeserializer<?> findMapDeserializer(MapType type, DeserializationConfig config, BeanDescription beanDesc, KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) throws JsonMappingException;
JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type, DeserializationConfig config, BeanDescription beanDesc, KeyDeserializer keyDeserializer, TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer) throws JsonMappingException;
JsonDeserializer<?> findEnumDeserializer(Class<?> type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException;
JsonDeserializer<?> findTreeNodeDeserializer(Class<? extends JsonNode> nodeType, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException;
public static abstract class Base implements Deserializers {
// Default implementations returning null
}
}
// Bean deserializer modifier
public abstract class BeanDeserializerModifier {
public List<BeanPropertyDefinition> updateProperties(DeserializationConfig config, BeanDescription beanDesc, List<BeanPropertyDefinition> propDefs);
public List<SettableBeanProperty> updateProperties(DeserializationConfig config, BeanDescription beanDesc, List<SettableBeanProperty> propDefs);
public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder);
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyArrayDeserializer(DeserializationConfig config, ArrayType valueType, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config, CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyCollectionLikeDeserializer(DeserializationConfig config, CollectionLikeType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyMapLikeDeserializer(DeserializationConfig config, MapLikeType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyEnumDeserializer(DeserializationConfig config, JavaType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer);
public JsonDeserializer<?> modifyKeyDeserializer(DeserializationConfig config, JavaType type, JsonDeserializer<?> deserializer);
}
// Problem handler for deserialization issues
public abstract class DeserializationProblemHandler {
public static final Object NOT_HANDLED = new Object();
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException;
public Object handleInstantiationProblem(DeserializationContext ctxt, Class<?> instClass, Object argument, Throwable t) throws IOException;
public Object handleMissingInstantiator(DeserializationContext ctxt, Class<?> instClass, ValueInstantiator valueInst, JsonParser p, String msg) throws IOException;
public Object handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) throws IOException;
public JavaType handleUnknownTypeId(DeserializationContext ctxt, JavaType baseType, String subTypeId, TypeIdResolver idResolver, String failureMsg) throws IOException;
public JavaType handleMissingTypeId(DeserializationContext ctxt, JavaType baseType, TypeIdResolver idResolver, String failureMsg) throws IOException;
}<function_calls> <invoke name="TodoWrite"> <parameter name="todos">[{"content": "Create entry-point document (index.md) with overview and key API snippets", "status": "completed", "activeForm": "Creating entry-point document"}, {"content": "Create object-mapping.md sub-document covering ObjectMapper, ObjectReader, ObjectWriter", "status": "completed", "activeForm": "Creating object-mapping.md"}, {"content": "Create json-tree-model.md sub-document covering JsonNode hierarchy and tree manipulation", "status": "completed", "activeForm": "Creating json-tree-model.md"}, {"content": "Create type-system.md sub-document covering JavaType and type handling", "status": "completed", "activeForm": "Creating type-system.md"}, {"content": "Create serialization.md sub-document covering JsonSerializer and serialization framework", "status": "completed", "activeForm": "Creating serialization.md"}, {"content": "Create deserialization.md sub-document covering JsonDeserializer and deserialization framework", "status": "completed", "activeForm": "Creating deserialization.md"}, {"content": "Create configuration.md sub-document covering features, settings, and configuration", "status": "in_progress", "activeForm": "Creating configuration.md"}, {"content": "Create annotations.md sub-document covering Jackson databind annotations", "status": "pending", "activeForm": "Creating annotations.md"}, {"content": "Create modules.md sub-document covering Module system and extensibility", "status": "pending", "activeForm": "Creating modules.md"}, {"content": "Create advanced-features.md sub-document covering polymorphism, custom handlers, etc.", "status": "pending", "activeForm": "Creating advanced-features.md"}]
Install with Tessl CLI
npx tessl i tessl/maven-com-fasterxml-jackson-core--jackson-databind