General data-binding functionality for Jackson: works on core streaming API
—
Jackson Databind provides extensive configuration capabilities through features, settings, and overrides that control serialization and deserialization behavior. The configuration system includes feature enums, configuration classes, and builder patterns for fine-grained control over JSON processing.
Jackson uses enum-based feature flags for configuration. Features are grouped into different categories based on their scope and purpose.
MapperFeature defines features that affect general mapper behavior and configuration.
public enum MapperFeature implements ConfigFeature {
// Annotation processing
USE_ANNOTATIONS(true),
// Creator detection
AUTO_DETECT_CREATORS(true),
AUTO_DETECT_FIELDS(true),
AUTO_DETECT_GETTERS(true),
AUTO_DETECT_IS_GETTERS(true),
AUTO_DETECT_SETTERS(true),
// Access modifier handling
REQUIRE_SETTERS_FOR_GETTERS(false),
ALLOW_FINAL_FIELDS_AS_MUTATORS(false),
INFER_PROPERTY_MUTATORS(true),
INFER_CREATOR_FROM_CONSTRUCTOR_PROPERTIES(true),
// Case sensitivity
ACCEPT_CASE_INSENSITIVE_PROPERTIES(false),
ACCEPT_CASE_INSENSITIVE_ENUMS(false),
ACCEPT_CASE_INSENSITIVE_VALUES(false),
// Static typing
USE_STATIC_TYPING(false),
// Base64 handling
USE_BASE64_VARIANT_FOR_BINARY(false),
// Getter behavior
DEFAULT_VIEW_INCLUSION(true),
SORT_PROPERTIES_ALPHABETICALLY(false),
// Visibility
OVERRIDE_PUBLIC_ACCESS_MODIFIERS(true),
// Coercion
USE_STD_BEAN_NAMING(false),
ALLOW_VOID_VALUED_PROPERTIES(false),
// Property inclusion
CAN_OVERRIDE_ACCESS_MODIFIERS(true),
// Constructor properties
INFER_BUILDER_TYPE_BINDINGS(true),
// Propagate transient marker
PROPAGATE_TRANSIENT_MARKER(false),
// Block unsafe polymorphic base types
BLOCK_UNSAFE_POLYMORPHIC_BASE_TYPES(false),
// Apply default values
APPLY_DEFAULT_VALUES(false);
private final boolean _defaultState;
private final int _mask;
private MapperFeature(boolean defaultState) {
_defaultState = defaultState;
_mask = (1 << ordinal());
}
public boolean enabledByDefault() {
return _defaultState;
}
public int getMask() {
return _mask;
}
public boolean enabledIn(int flags) {
return (flags & _mask) != 0;
}
}SerializationFeature controls serialization behavior (covered in detail in serialization.md).
public enum SerializationFeature implements ConfigFeature {
WRAP_ROOT_VALUE(false),
INDENT_OUTPUT(false),
FAIL_ON_EMPTY_BEANS(true),
FAIL_ON_SELF_REFERENCES(true),
WRAP_EXCEPTIONS(true),
FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS(true),
WRITE_SELF_REFERENCES_AS_NULL(false),
CLOSE_CLOSEABLE(false),
FLUSH_AFTER_WRITE_VALUE(true),
WRITE_DATES_AS_TIMESTAMPS(true),
WRITE_DATE_KEYS_AS_TIMESTAMPS(false),
WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS(false),
WRITE_ENUMS_USING_TO_STRING(false),
WRITE_ENUMS_USING_INDEX(false),
WRITE_ENUM_KEYS_USING_INDEX(false),
WRITE_NULL_MAP_VALUES(true),
WRITE_EMPTY_JSON_ARRAYS(true),
WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED(false),
WRITE_BIGDECIMAL_AS_PLAIN(false),
WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(true),
ORDER_MAP_ENTRIES_BY_KEYS(false),
USE_EQUALITY_FOR_OBJECT_ID(false);
// Implementation similar to MapperFeature
}DeserializationFeature controls deserialization behavior (covered in detail in deserialization.md).
public enum DeserializationFeature implements ConfigFeature {
USE_BIG_DECIMAL_FOR_FLOATS(false),
USE_BIG_INTEGER_FOR_INTS(false),
USE_LONG_FOR_INTS(false),
USE_JAVA_ARRAY_FOR_JSON_ARRAY(false),
FAIL_ON_UNKNOWN_PROPERTIES(true),
FAIL_ON_NULL_FOR_PRIMITIVES(false),
FAIL_ON_NUMBERS_FOR_ENUMS(false),
FAIL_ON_INVALID_SUBTYPE(true),
FAIL_ON_READING_DUP_TREE_KEY(false),
FAIL_ON_IGNORED_PROPERTIES(false),
FAIL_ON_UNRESOLVED_OBJECT_IDS(true),
FAIL_ON_MISSING_CREATOR_PROPERTIES(false),
FAIL_ON_NULL_CREATOR_PROPERTIES(false),
FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY(true),
FAIL_ON_TRAILING_TOKENS(false),
WRAP_EXCEPTIONS(true),
ACCEPT_SINGLE_VALUE_AS_ARRAY(false),
UNWRAP_SINGLE_VALUE_ARRAYS(false),
UNWRAP_ROOT_VALUE(false),
ACCEPT_EMPTY_STRING_AS_NULL_OBJECT(false),
ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT(false),
ACCEPT_FLOAT_AS_INT(true),
READ_ENUMS_USING_TO_STRING(false),
READ_UNKNOWN_ENUM_VALUES_AS_NULL(false),
READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE(false),
READ_DATE_TIMESTAMPS_AS_NANOSECONDS(true),
ADJUST_DATES_TO_CONTEXT_TIME_ZONE(true),
EAGER_DESERIALIZER_FETCH(true);
// Implementation similar to MapperFeature
}MapperConfig is the base class for mapper configuration objects.
public abstract class MapperConfig<T> implements ClassIntrospector.MixInResolver, Serializable {
// Feature checking
public final boolean isEnabled(MapperFeature f);
public final boolean isEnabled(JsonFactory.Feature f);
public final boolean hasMapperFeatures(int featureMask);
public final boolean hasSomeOfFeatures(int featureMask);
// Settings access
public final BaseSettings getBase();
public final AnnotationIntrospector getAnnotationIntrospector();
public final VisibilityChecker<?> getDefaultVisibilityChecker();
public SubtypeResolver getSubtypeResolver();
public final PropertyNamingStrategy getPropertyNamingStrategy();
public final HandlerInstantiator getHandlerInstantiator();
public final TypeResolverBuilder<?> getDefaultTyper();
// Type factory
public final TypeFactory getTypeFactory();
// Access control
public final boolean canOverrideAccessModifiers();
public final boolean shouldSortPropertiesAlphabetically();
// Locale and timezone
public final Locale getLocale();
public final TimeZone getTimeZone();
// Property inclusion
public abstract JsonInclude.Value getDefaultPropertyInclusion();
public abstract JsonInclude.Value getDefaultPropertyInclusion(Class<?> baseType);
public JsonInclude.Value getDefaultInclusion(Class<?> baseType, Class<?> propertyType);
// Configuration overrides
public final ConfigOverride findConfigOverride(Class<?> type);
public final ConfigOverride getConfigOverride(Class<?> type);
public final JsonInclude.Value getDefaultPropertyInclusion(Class<?> baseType, JsonInclude.Value defaultIncl);
public final JsonFormat.Value getDefaultPropertyFormat(Class<?> type);
public final VisibilityChecker<?> getDefaultVisibilityChecker(Class<?> forClass, VisibilityChecker<?> defaultVc);
// Mix-in support (from MixInResolver)
public final Class<?> findMixInClassFor(Class<?> cls);
public final int mixInCount();
// Root name handling
public abstract PropertyName findRootName(JavaType rootType);
public abstract PropertyName findRootName(Class<?> rawRootType);
// View support
public final Class<?> getActiveView();
// Context attributes
public abstract ContextAttributes getAttributes();
// Introspection
public final ClassIntrospector getClassIntrospector();
// Problem handlers (for deserialization config)
public abstract boolean useRootWrapping();
// Date format
public final DateFormat getDateFormat();
// Constructor detector
public final ConstructorDetector getConstructorDetector();
// Coercion configs
public final CoercionConfigs getCoercionConfigs();
}BaseSettings contains shared configuration settings.
public final class BaseSettings implements Serializable {
// Construction
public BaseSettings(ClassIntrospector ci, AnnotationIntrospector ai, VisibilityChecker<?> vc, PropertyNamingStrategy pns, TypeFactory tf, TypeResolverBuilder<?> typer, DateFormat dateFormat, HandlerInstantiator hi, Locale locale, TimeZone tz, Base64Variant base64);
// Component access
public ClassIntrospector getClassIntrospector();
public AnnotationIntrospector getAnnotationIntrospector();
public PropertyNamingStrategy getPropertyNamingStrategy();
public TypeFactory getTypeFactory();
public TypeResolverBuilder<?> getTypeResolverBuilder();
public DateFormat getDateFormat();
public HandlerInstantiator getHandlerInstantiator();
public Locale getLocale();
public TimeZone getTimeZone();
public VisibilityChecker<?> getDefaultVisibilityChecker();
public Base64Variant getBase64Variant();
// Modification methods
public BaseSettings withClassIntrospector(ClassIntrospector ci);
public BaseSettings withAnnotationIntrospector(AnnotationIntrospector ai);
public BaseSettings withInsertedAnnotationIntrospector(AnnotationIntrospector ai);
public BaseSettings withAppendedAnnotationIntrospector(AnnotationIntrospector ai);
public BaseSettings withVisibilityChecker(VisibilityChecker<?> vc);
public BaseSettings withPropertyNamingStrategy(PropertyNamingStrategy pns);
public BaseSettings withTypeFactory(TypeFactory tf);
public BaseSettings withTypeResolverBuilder(TypeResolverBuilder<?> typer);
public BaseSettings withDateFormat(DateFormat df);
public BaseSettings withHandlerInstantiator(HandlerInstantiator hi);
public BaseSettings withLocale(Locale l);
public BaseSettings withTimeZone(TimeZone tz);
public BaseSettings withBase64Variant(Base64Variant base64);
}ConfigOverride allows per-type configuration overrides.
public abstract class ConfigOverride {
// Format override
public JsonFormat.Value getFormat();
// Inclusion override
public JsonInclude.Value getInclude();
public JsonInclude.Value getIncludeAsProperty();
// Ignored properties
public JsonIgnoreProperties.Value getIgnorals();
// Setter configuration
public JsonSetter.Value getSetterInfo();
// Visibility
public VisibilityChecker.Std getVisibility();
// Mergeable info
public Boolean getMergeable();
// Null handling
public JsonSetter.Value getNullHandling();
}
public class MutableConfigOverride extends ConfigOverride {
// Modification methods
public MutableConfigOverride setFormat(JsonFormat.Value v);
public MutableConfigOverride setInclude(JsonInclude.Value v);
public MutableConfigOverride setIncludeAsProperty(JsonInclude.Value v);
public MutableConfigOverride setIgnorals(JsonIgnoreProperties.Value v);
public MutableConfigOverride setSetterInfo(JsonSetter.Value v);
public MutableConfigOverride setVisibility(VisibilityChecker.Std v);
public MutableConfigOverride setMergeable(Boolean v);
public MutableConfigOverride setNullHandling(JsonSetter.Value v);
}
public class ConfigOverrides {
// Override access
public ConfigOverride findOverride(Class<?> type);
// Default settings
public MutableConfigOverride setDefaultInclusion(JsonInclude.Value v);
public MutableConfigOverride setDefaultSetterInfo(JsonSetter.Value v);
public MutableConfigOverride setDefaultMergeable(Boolean v);
public MutableConfigOverride setDefaultLeniency(Boolean v);
// Type-specific overrides
public MutableConfigOverride findOrCreateOverride(Class<?> type);
}ContextAttributes provides a way to pass context-specific data during serialization/deserialization.
public abstract class ContextAttributes {
// Attribute access
public abstract Object getAttribute(Object key);
public abstract ContextAttributes withSharedAttribute(Object key, Object value);
public abstract ContextAttributes withSharedAttributes(Map<?, ?> attributes);
public abstract ContextAttributes withPerCallAttribute(Object key, Object value);
public abstract ContextAttributes withoutSharedAttribute(Object key);
// Factory methods
public static ContextAttributes getEmpty();
// Implementation class
public static class Impl extends ContextAttributes implements Serializable {
public Impl(Map<?, ?> shared);
public Impl(Map<?, ?> shared, Map<?, ?> perCall);
public Object getAttribute(Object key);
public ContextAttributes withSharedAttribute(Object key, Object value);
public ContextAttributes withSharedAttributes(Map<?, ?> attributes);
public ContextAttributes withPerCallAttribute(Object key, Object value);
public ContextAttributes withoutSharedAttribute(Object key);
}
}ConstructorDetector configures how constructors are detected and used for deserialization.
public final class ConstructorDetector implements Serializable {
// Predefined strategies
public static final ConstructorDetector DEFAULT;
public static final ConstructorDetector USE_PROPERTIES_BASED;
public static final ConstructorDetector USE_DELEGATING;
public static final ConstructorDetector EXPLICIT_ONLY;
// Factory methods
public static ConstructorDetector requireCtorAnnotation();
public static ConstructorDetector useDefaultConstructor();
public static ConstructorDetector useDelegating();
public static ConstructorDetector useProperties();
// Configuration methods
public ConstructorDetector withRequireAnnotation(boolean state);
public ConstructorDetector withAllowJDKTypeConstructors(boolean state);
public ConstructorDetector withSingleArgConstructorStrategy(SingleArgConstructor strategy);
// Query methods
public boolean requireCtorAnnotation();
public boolean allowJDKTypeConstructors();
public SingleArgConstructor singleArgConstructorStrategy();
// Single argument constructor strategy
public enum SingleArgConstructor {
DELEGATING,
PROPERTIES,
HEURISTIC;
}
}CoercionConfig controls type coercion behavior during deserialization.
public class CoercionConfig implements Serializable {
// Coercion action lookup
public CoercionAction findAction(CoercionInputShape inputShape);
// Boolean coercion settings
public Boolean getAcceptBlankAsEmpty();
// State checking
public boolean isCoercionEnabled();
}
public class MutableCoercionConfig extends CoercionConfig {
// Action configuration
public MutableCoercionConfig setCoercion(CoercionInputShape shape, CoercionAction action);
public MutableCoercionConfig setAcceptBlankAsEmpty(Boolean state);
}
public class CoercionConfigs implements Serializable {
// Default coercion lookup
public CoercionAction findCoercion(DeserializationConfig config, LogicalType logicalType, Class<?> rawTargetType, CoercionInputShape inputShape);
public CoercionAction findCoercionFromBlankString(DeserializationConfig config, LogicalType logicalType, Class<?> rawTargetType, CoercionAction actionIfBlankNotAllowed);
// Default coercion config access
public MutableCoercionConfig defaultCoercions();
// Type-specific coercion config
public MutableCoercionConfig findOrCreateCoercion(LogicalType logicalType);
public MutableCoercionConfig findOrCreateCoercion(Class<?> rawType);
}
// Coercion enums
public enum CoercionAction {
AsEmpty,
AsNull,
Fail,
TryConvert;
}
public enum CoercionInputShape {
Array,
Boolean,
Float,
Integer,
Object,
String;
}CacheProvider allows customization of caching strategies for deserializers, serializers, and type information.
public interface CacheProvider {
// Cache creation for different components
LookupCache<Object, JsonDeserializer<Object>> forDeserializerCache(DeserializationConfig config);
LookupCache<Object, JsonSerializer<Object>> forSerializerCache(SerializationConfig config);
LookupCache<Object, JavaType> forTypeFactory();
}
public class DefaultCacheProvider implements CacheProvider {
// Default cache instances
public static final CacheProvider INSTANCE;
// Cache factory methods with default implementations
public LookupCache<Object, JsonDeserializer<Object>> forDeserializerCache(DeserializationConfig config);
public LookupCache<Object, JsonSerializer<Object>> forSerializerCache(SerializationConfig config);
public LookupCache<Object, JavaType> forTypeFactory();
}import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
ObjectMapper mapper = new ObjectMapper();
// Configure serialization features
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 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);
// Configure mapper features
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
// Enable/disable multiple features at once
mapper.enable(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,
SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
mapper.disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES,
DeserializationFeature.FAIL_ON_INVALID_SUBTYPE);
// Check feature status
boolean indented = mapper.isEnabled(SerializationFeature.INDENT_OUTPUT);
boolean caseSensitive = !mapper.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
boolean strict = mapper.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.cfg.ConfigOverrides;
ObjectMapper mapper = new ObjectMapper();
// Global inclusion setting
mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_NULL);
// Per-type overrides
ConfigOverrides overrides = mapper.getConfigOverrides();
// Override Date formatting for all Date fields
overrides.findOrCreateOverride(Date.class)
.setFormat(JsonFormat.Value.forPattern("yyyy-MM-dd"));
// Override inclusion for specific type
overrides.findOrCreateOverride(OptionalData.class)
.setInclude(JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, null));
// Override property naming for specific type
overrides.findOrCreateOverride(LegacyData.class)
.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.OBJECT));
// Multiple overrides for a type
overrides.findOrCreateOverride(PersonData.class)
.setInclude(JsonInclude.Value.construct(JsonInclude.Include.NON_DEFAULT, null))
.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.OBJECT))
.setMergeable(Boolean.TRUE);import com.fasterxml.jackson.databind.cfg.ContextAttributes;
ObjectMapper mapper = new ObjectMapper();
// Set default context attributes
Map<String, Object> defaultAttrs = new HashMap<>();
defaultAttrs.put("version", "2.0");
defaultAttrs.put("environment", "production");
mapper.setDefaultAttributes(ContextAttributes.getEmpty().withSharedAttributes(defaultAttrs));
// Use with ObjectReader/ObjectWriter for per-operation attributes
ObjectReader reader = mapper.reader()
.withAttribute("requestId", "12345")
.withAttribute("userId", "user123");
ObjectWriter writer = mapper.writer()
.withAttribute("outputFormat", "compact")
.withAttribute("includeMetadata", true);
// Custom serializer that uses context attributes
public class MetadataAwareSerializer extends StdSerializer<MyData> {
public MetadataAwareSerializer() {
super(MyData.class);
}
@Override
public void serialize(MyData value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
// Write standard fields
gen.writeStringField("id", value.getId());
gen.writeStringField("name", value.getName());
// Check context for metadata inclusion
Boolean includeMetadata = (Boolean) serializers.getAttribute("includeMetadata");
if (Boolean.TRUE.equals(includeMetadata)) {
gen.writeStringField("version", (String) serializers.getAttribute("version"));
gen.writeStringField("environment", (String) serializers.getAttribute("environment"));
}
gen.writeEndObject();
}
}import com.fasterxml.jackson.databind.cfg.ConstructorDetector;
ObjectMapper mapper = new ObjectMapper();
// Require explicit @JsonCreator annotations
mapper.setConstructorDetector(ConstructorDetector.requireCtorAnnotation());
// Use properties-based detection primarily
mapper.setConstructorDetector(ConstructorDetector.useProperties());
// Custom constructor detection strategy
ConstructorDetector customDetector = ConstructorDetector.DEFAULT
.withRequireAnnotation(false)
.withAllowJDKTypeConstructors(true)
.withSingleArgConstructorStrategy(ConstructorDetector.SingleArgConstructor.HEURISTIC);
mapper.setConstructorDetector(customDetector);
// Example POJOs that work with different strategies
public class ExplicitPerson {
private String name;
private int age;
// Requires @JsonCreator when using requireCtorAnnotation()
@JsonCreator
public ExplicitPerson(@JsonProperty("name") String name, @JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
// getters/setters
}
public class PropertiesPerson {
private String name;
private int age;
// No annotations needed when using useProperties()
public PropertiesPerson(String name, int age) {
this.name = name;
this.age = age;
}
// getters/setters
}import com.fasterxml.jackson.databind.cfg.CoercionAction;
import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
import com.fasterxml.jackson.databind.type.LogicalType;
ObjectMapper mapper = new ObjectMapper();
// Configure default coercion behavior
mapper.coercionConfigDefaults()
.setCoercion(CoercionInputShape.String, CoercionAction.TryConvert)
.setCoercion(CoercionInputShape.Integer, CoercionAction.TryConvert)
.setAcceptBlankAsEmpty(Boolean.TRUE);
// Configure coercion for specific logical types
mapper.coercionConfigFor(LogicalType.Boolean)
.setCoercion(CoercionInputShape.String, CoercionAction.TryConvert);
mapper.coercionConfigFor(LogicalType.Integer)
.setCoercion(CoercionInputShape.Float, CoercionAction.TryConvert)
.setCoercion(CoercionInputShape.String, CoercionAction.Fail);
// Configure coercion for specific Java types
mapper.coercionConfigFor(LocalDate.class)
.setCoercion(CoercionInputShape.String, CoercionAction.TryConvert)
.setAcceptBlankAsEmpty(Boolean.FALSE);
// Test coercion behavior
String json = """
{
"active": "true",
"count": "123",
"rate": 45.67,
"date": "2024-01-15"
}
""";
// This will succeed with coercion enabled
DataRecord record = mapper.readValue(json, DataRecord.class);
public class DataRecord {
public boolean active; // "true" -> true
public int count; // "123" -> 123
public int rate; // 45.67 -> 45 (if coercion enabled)
public LocalDate date; // "2024-01-15" -> LocalDate (if coercion enabled)
}import com.fasterxml.jackson.databind.json.JsonMapper;
// Using JsonMapper builder for comprehensive configuration
JsonMapper mapper = JsonMapper.builder()
// Features
.enable(SerializationFeature.INDENT_OUTPUT)
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
// Date handling
.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"))
.defaultTimeZone(TimeZone.getTimeZone("UTC"))
.defaultLocale(Locale.US)
// Property inclusion
.serializationInclusion(JsonInclude.Include.NON_NULL)
// Property naming
.propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
// Visibility
.visibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
// Constructor detection
.constructorDetector(ConstructorDetector.useProperties())
// Polymorphic type validation
.polymorphicTypeValidator(BasicPolymorphicTypeValidator.builder()
.allowIfSubType("com.example.model")
.build())
// Build the mapper
.build();
// Additional configuration after building
mapper.registerModule(new JavaTimeModule());
mapper.addMixIn(ThirdPartyClass.class, ThirdPartyMixin.class);
// Type-specific overrides
mapper.configOverride(BigDecimal.class)
.setFormat(JsonFormat.Value.forShape(JsonFormat.Shape.STRING));// Custom configuration holder
public class JsonConfiguration {
private final ObjectMapper mapper;
public JsonConfiguration() {
this.mapper = createConfiguredMapper();
}
private ObjectMapper createConfiguredMapper() {
ObjectMapper mapper = new ObjectMapper();
// Standard configuration
configureFeatures(mapper);
configureFormatting(mapper);
configureCoercion(mapper);
configureOverrides(mapper);
return mapper;
}
private void configureFeatures(ObjectMapper mapper) {
// Serialization
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
// Deserialization
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
// Mapper
mapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
mapper.disable(MapperFeature.AUTO_DETECT_CREATORS);
}
private void configureFormatting(ObjectMapper mapper) {
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
mapper.setTimeZone(TimeZone.getTimeZone("UTC"));
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE);
}
private void configureCoercion(ObjectMapper mapper) {
mapper.coercionConfigDefaults()
.setAcceptBlankAsEmpty(Boolean.TRUE);
mapper.coercionConfigFor(LogicalType.Boolean)
.setCoercion(CoercionInputShape.String, CoercionAction.TryConvert);
}
private void configureOverrides(ObjectMapper mapper) {
// Date formatting override
mapper.configOverride(Date.class)
.setFormat(JsonFormat.Value.forPattern("yyyy-MM-dd"));
// Inclusion override for Optional types
mapper.configOverride(Optional.class)
.setInclude(JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, null));
}
public ObjectMapper getMapper() {
return mapper;
}
// Environment-specific configurations
public static JsonConfiguration forProduction() {
JsonConfiguration config = new JsonConfiguration();
config.mapper.disable(SerializationFeature.INDENT_OUTPUT); // Compact output
config.mapper.enable(SerializationFeature.FAIL_ON_EMPTY_BEANS); // Strict validation
return config;
}
public static JsonConfiguration forDevelopment() {
JsonConfiguration config = new JsonConfiguration();
config.mapper.enable(SerializationFeature.INDENT_OUTPUT); // Pretty printing
config.mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); // Lenient
return config;
}
}// Configuration feature interface
public interface ConfigFeature {
boolean enabledByDefault();
int getMask();
boolean enabledIn(int flags);
}
// Factory configuration classes
public final class SerializerFactoryConfig implements Serializable {
public SerializerFactoryConfig withAdditionalSerializers(Serializers additional);
public SerializerFactoryConfig withAdditionalKeySerializers(Serializers additional);
public SerializerFactoryConfig withSerializerModifier(BeanSerializerModifier modifier);
public SerializerFactoryConfig withFilters(FilterProvider filterProvider);
public boolean hasSerializers();
public boolean hasKeySerializers();
public boolean hasSerializerModifiers();
public Iterable<Serializers> serializers();
public Iterable<Serializers> keySerializers();
public Iterable<BeanSerializerModifier> serializerModifiers();
public FilterProvider filterProvider();
}
public class DeserializerFactoryConfig implements Serializable {
public DeserializerFactoryConfig withAdditionalDeserializers(Deserializers additional);
public DeserializerFactoryConfig withAdditionalKeyDeserializers(KeyDeserializers additional);
public DeserializerFactoryConfig withDeserializerModifier(BeanDeserializerModifier modifier);
public DeserializerFactoryConfig withAbstractTypeResolver(AbstractTypeResolver resolver);
public DeserializerFactoryConfig withValueInstantiators(ValueInstantiators instantiators);
public boolean hasDeserializers();
public boolean hasKeyDeserializers();
public boolean hasDeserializerModifiers();
public boolean hasAbstractTypeResolvers();
public boolean hasValueInstantiators();
public Iterable<Deserializers> deserializers();
public Iterable<KeyDeserializers> keyDeserializers();
public Iterable<BeanDeserializerModifier> deserializerModifiers();
public Iterable<AbstractTypeResolver> abstractTypeResolvers();
public Iterable<ValueInstantiators> valueInstantiators();
}
// Datatype feature interface for specialized features
public interface DatatypeFeature extends JacksonFeature {
boolean enabledByDefault();
int getMask();
boolean enabledIn(int flags);
}
// Container for datatype features
public class DatatypeFeatures {
public static DatatypeFeatures defaultFeatures();
public boolean isEnabled(DatatypeFeature feature);
public DatatypeFeatures with(DatatypeFeature feature);
public DatatypeFeatures without(DatatypeFeature feature);
public DatatypeFeatures withFeatures(DatatypeFeature... features);
public DatatypeFeatures withoutFeatures(DatatypeFeature... features);
}
// Enum and JsonNode features
public enum EnumFeature implements DatatypeFeature {
READ_ENUM_KEYS_USING_INDEX(false),
WRITE_ENUM_KEYS_USING_INDEX(false);
}
public enum JsonNodeFeature implements DatatypeFeature {
READ_NULL_PROPERTIES(false),
WRITE_NULL_PROPERTIES(true);
}Install with Tessl CLI
npx tessl i tessl/maven-com-fasterxml-jackson-core--jackson-databind