下面列出了怎么用com.fasterxml.jackson.databind.DeserializationConfig的API类实例代码及写法,或者点击链接到github查看源代码。
public static ObjectMapper createWithCaseInsensitiveEnumDeserializer()
{
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier()
{
@Override
public JsonDeserializer<Enum<?>> modifyEnumDeserializer(DeserializationConfig config, final JavaType type,
BeanDescription beanDescription, final JsonDeserializer<?> deserializer)
{
return new JsonDeserializer<>()
{
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Enum<?> deserialize(JsonParser parser, DeserializationContext context) throws IOException
{
return Enum.valueOf((Class<? extends Enum>) type.getRawClass(),
parser.getValueAsString().toUpperCase());
}
};
}
});
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
@Override
public List<BeanPropertyDefinition> updateProperties(
DeserializationConfig config, BeanDescription beanDesc,
List<BeanPropertyDefinition> propDefs) {
if (!type.equals(beanDesc.getBeanClass())) {
return propDefs;
}
List<BeanPropertyDefinition> newPropDefs = new ArrayList<>();
for (BeanPropertyDefinition propDef : propDefs) {
if (!ignorables.contains(propDef.getName())) {
newPropDefs.add(propDef);
}
}
return newPropDefs;
}
@Override
public List<BeanPropertyDefinition> updateProperties(
DeserializationConfig config, BeanDescription beanDesc,
List<BeanPropertyDefinition> propDefs) {
if (!type.equals(beanDesc.getBeanClass())) {
return propDefs;
}
List<BeanPropertyDefinition> newPropDefs = new ArrayList<>();
for (BeanPropertyDefinition propDef : propDefs) {
if (!ignorables.contains(propDef.getName())) {
newPropDefs.add(propDef);
}
}
return newPropDefs;
}
private static ObjectMapper configureObjectMapper(
ObjectMapper objectMapper, boolean shouldIncludeRawResponses) {
if (shouldIncludeRawResponses) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc,
JsonDeserializer<?> deserializer) {
if (Response.class.isAssignableFrom(beanDesc.getBeanClass())) {
return new RawResponseDeserializer(deserializer);
}
return deserializer;
}
});
objectMapper.registerModule(module);
}
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
private static ObjectMapper configureObjectMapper(
ObjectMapper objectMapper, boolean shouldIncludeRawResponses) {
if (shouldIncludeRawResponses) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc,
JsonDeserializer<?> deserializer) {
if (Response.class.isAssignableFrom(beanDesc.getBeanClass())) {
return new RawResponseDeserializer(deserializer);
}
return deserializer;
}
});
objectMapper.registerModule(module);
}
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
/**
* {@inheritDoc}
*/
@Override
public RegistrationExtensionClientInput<?> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String name = p.getParsingContext().getCurrentName();
if (name == null) {
name = p.getParsingContext().getParent().getCurrentName();
}
DeserializationConfig config = ctxt.getConfig();
AnnotatedClass annotatedClass = AnnotatedClassResolver.resolveWithoutSuperTypes(config, RegistrationExtensionClientInput.class);
Collection<NamedType> namedTypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(config, annotatedClass);
for (NamedType namedType : namedTypes) {
if (Objects.equals(namedType.getName(), name)) {
return (RegistrationExtensionClientInput<?>) ctxt.readValue(p, namedType.getType());
}
}
logger.warn("Unknown extension '{}' is contained.", name);
return ctxt.readValue(p, UnknownExtensionClientInput.class);
}
/**
* {@inheritDoc}
*/
@Override
public ExtensionAuthenticatorOutput<?> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String name = p.getParsingContext().getCurrentName();
if (name == null) {
name = p.getParsingContext().getParent().getCurrentName();
}
DeserializationConfig config = ctxt.getConfig();
AnnotatedClass annotatedClass = AnnotatedClassResolver.resolveWithoutSuperTypes(config, ExtensionAuthenticatorOutput.class);
Collection<NamedType> namedTypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(config, annotatedClass);
for (NamedType namedType : namedTypes) {
if (Objects.equals(namedType.getName(), name)) {
return (ExtensionAuthenticatorOutput<?>) ctxt.readValue(p, namedType.getType());
}
}
logger.warn("Unknown extension '{}' is contained.", name);
return ctxt.readValue(p, UnknownExtensionAuthenticatorOutput.class);
}
/**
* {@inheritDoc}
*/
@Override
public ExtensionClientInput<?> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String name = p.getParsingContext().getCurrentName();
if (name == null) {
name = p.getParsingContext().getParent().getCurrentName();
}
DeserializationConfig config = ctxt.getConfig();
AnnotatedClass annotatedClass = AnnotatedClassResolver.resolveWithoutSuperTypes(config, ExtensionClientInput.class);
Collection<NamedType> namedTypes = config.getSubtypeResolver().collectAndResolveSubtypesByClass(config, annotatedClass);
for (NamedType namedType : namedTypes) {
if (Objects.equals(namedType.getName(), name)) {
return (ExtensionClientInput<?>) ctxt.readValue(p, namedType.getType());
}
}
logger.warn("Unknown extension '{}' is contained.", name);
return ctxt.readValue(p, UnknownExtensionClientInput.class);
}
/**
* First test verifies that bean builder works as expected
*/
public void testLowLevelMaterializer() throws Exception
{
AbstractTypeMaterializer mat = new AbstractTypeMaterializer();
DeserializationConfig config = new ObjectMapper().deserializationConfig();
Class<?> impl = _materializeRawType(mat, config, Bean.class);
assertNotNull(impl);
assertTrue(Bean.class.isAssignableFrom(impl));
// also, let's instantiate to make sure:
Object ob = ClassUtil.createInstance(impl, false);
// and just for good measure do actual cast
Bean bean = (Bean) ob;
// call something to ensure generation worked...
assertNull(bean.getA());
// Also: let's verify that we can handle dup calls:
Class<?> impl2 = _materializeRawType(mat, config, Bean.class);
assertNotNull(impl2);
assertSame(impl, impl2);
}
/**
* Gets a module wrapping this serializer as an adapter for the Jackson
* ObjectMapper.
*
* @param mapper the object mapper for default deserializations
* @return a simple module to be plugged onto Jackson ObjectMapper.
*/
public static SimpleModule getModule(final ObjectMapper mapper) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (BeanDeserializer.class.isAssignableFrom(deserializer.getClass())) {
// Apply flattening deserializer on all POJO types.
return new FlatteningDeserializer(beanDesc.getBeanClass(), deserializer, mapper);
} else {
return deserializer;
}
}
});
return module;
}
@Override
public BasicBeanDescription forDeserialization(DeserializationConfig cfg,
JavaType type, MixInResolver r)
{
// minor optimization: for some JDK types do minimal introspection
BasicBeanDescription desc = _findStdTypeDesc(type);
if (desc == null) {
// As per [Databind#550], skip full introspection for some of standard
// structured types as well
desc = _findStdJdkCollectionDesc(cfg, type);
if (desc == null) {
desc = BasicBeanDescription.forDeserialization(collectProperties(cfg,
type, r, false, "set"));
}
// Also: this is a superset of "forClassAnnotations", so may optimize by optional add:
_cachedFCA.putIfAbsent(type, desc);
}
return desc;
}
@Override
public BasicBeanDescription forCreation(DeserializationConfig cfg,
JavaType type, MixInResolver r)
{
BasicBeanDescription desc = _findStdTypeDesc(type);
if (desc == null) {
// As per [Databind#550], skip full introspection for some of standard
// structured types as well
desc = _findStdJdkCollectionDesc(cfg, type);
if (desc == null) {
desc = BasicBeanDescription.forDeserialization(
collectProperties(cfg, type, r, false, "set"));
}
}
// should this be cached for FCA?
return desc;
}
/**
* Entry-point for {@link AbstractTypeResolver} that Jackson calls to materialize
* an abstract type.
*/
@Override
public JavaType resolveAbstractType(DeserializationConfig config, BeanDescription beanDesc)
{
final JavaType type = beanDesc.getType();
if (!_suitableType(type)) {
return null;
}
// might want to skip proxies, local types too... but let them be for now:
//if (intr.findTypeResolver(beanDesc.getClassInfo(), type) == null) {
Class<?> materializedType;
if (type.hasGenericTypes()) {
materializedType = materializeGenericType(config, type);
} else {
materializedType = materializeRawType(config, beanDesc.getClassInfo());
}
return config.constructType(materializedType);
}
/**
* Gets a module wrapping this serializer as an adapter for the Jackson
* ObjectMapper.
*
* @param mapper the object mapper for default deserializations
* @return a simple module to be plugged onto Jackson ObjectMapper.
*/
public static SimpleModule getModule(final ObjectMapper mapper) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (BeanDeserializer.class.isAssignableFrom(deserializer.getClass())) {
// Apply flattening deserializer on all POJO types.
return new FlatteningDeserializer(beanDesc.getBeanClass(), deserializer, mapper);
} else {
return deserializer;
}
}
});
return module;
}
/**
* Gets a module wrapping this serializer as an adapter for the Jackson
* ObjectMapper.
*
* @param mapper the object mapper for default deserializations
* @return a simple module to be plugged onto Jackson ObjectMapper.
*/
public static SimpleModule getModule(final ObjectMapper mapper) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
for (Class<?> c : TypeToken.of(beanDesc.getBeanClass()).getTypes().classes().rawTypes()) {
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
if ("additionalProperties".equalsIgnoreCase(field.getName())) {
JsonProperty property = field.getAnnotation(JsonProperty.class);
if (property != null && property.value().isEmpty()) {
return new AdditionalPropertiesDeserializer(beanDesc.getBeanClass(), deserializer, mapper);
}
}
}
}
return deserializer;
}
});
return module;
}
@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config, BeanDescription beanDesc,
BeanDeserializerBuilder builder) {
if (!type.equals(beanDesc.getBeanClass())) {
return builder;
}
for (String ignorable : ignorables) {
builder.addIgnorable(ignorable);
}
return builder;
}
@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config, BeanDescription beanDesc,
BeanDeserializerBuilder builder) {
if (!type.equals(beanDesc.getBeanClass())) {
return builder;
}
for (String ignorable : ignorables) {
builder.addIgnorable(ignorable);
}
return builder;
}
public RestEngineTimeModule(String[] patterns) {
this();
setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (beanDesc.getBeanClass() == String.class) {
CustomDateDeserializer dateDeserializer = new CustomDateDeserializer(deserializer);
dateDeserializer.setPatterns(patterns);
return dateDeserializer;
}
return deserializer;
}
});
}
public RestEngineTimeModule(String[] patterns, String[] exclusionKeys) {
this();
setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (beanDesc.getBeanClass() == String.class) {
CustomDateDeserializer dateDeserializer = new CustomDateDeserializer(deserializer);
dateDeserializer.setPatterns(patterns);
dateDeserializer.setExclusions(exclusionKeys);
return dateDeserializer;
}
return deserializer;
}
});
}
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (Metric.class.equals(beanDesc.getBeanClass())) {
return new MetricDeserializer(deserializer);
}
return super.modifyDeserializer(config, beanDesc, deserializer);
}
@SuppressWarnings("unchecked")
public T deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException {
ObjectCodec objectCodec = jsonParser.getCodec();
ObjectNode objectNode = objectCodec.readTree(jsonParser);
String typeValue = null;
JsonNode type = objectNode.get(TYPE_PROPERTY);
if (type != null) {
typeValue = type.asText();
if (STRING_PROPERTY_VALUE.equals(typeValue)) {
if (objectNode.get(ENUM_PROPERTY) != null) {
typeValue = "enum";
}
}
} else {
if (objectNode.get(REF_PROPERTY) != null) {
typeValue = "ref";
}
}
if (typeValue == null) {
throw new JsonParseException(jsonParser, "Unknown object type.");
}
DeserializationConfig config = context.getConfig();
AnnotatedClass annotatedClass =
AnnotatedClassResolver.resolveWithoutSuperTypes(config, handledType());
List<NamedType> subtypes = config.getAnnotationIntrospector().findSubtypes(annotatedClass);
for (NamedType namedType : subtypes) {
if (typeValue.equals(namedType.getName())) {
return (T) objectCodec.treeToValue(objectNode, namedType.getType());
}
}
throw new JsonParseException(jsonParser, "Unknown object type " + typeValue + ".");
}
private Class<?> _materializeRawType(AbstractTypeMaterializer mat,
DeserializationConfig config, Class<?> cls)
{
JavaType type = config.constructType(cls);
return mat.materializeRawType(config,
AnnotatedClassResolver.resolve(config, type, config));
}
private static ObjectMapper configureObjectMapper(
ObjectMapper objectMapper, boolean shouldIncludeRawResponses) {
if (shouldIncludeRawResponses) {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(
new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(
DeserializationConfig config,
BeanDescription beanDesc,
JsonDeserializer<?> deserializer) {
if (Response.class.isAssignableFrom(beanDesc.getBeanClass())) {
return new RawResponseDeserializer(deserializer);
}
return deserializer;
}
});
objectMapper.registerModule(module);
}
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
@Override
public ValueInstantiator findValueInstantiator(DeserializationConfig config,
BeanDescription beanDesc, ValueInstantiator defaultInstantiator)
{
ValueInstantiator inst = _classMappings.get(new ClassKey(beanDesc.getBeanClass()));
return (inst == null) ? defaultInstantiator : inst;
}
@Override
public JavaType findTypeMapping(DeserializationConfig config, JavaType type)
{
// this is the main mapping base, so let's
Class<?> src = type.getRawClass();
Class<?> dst = _mappings.get(new ClassKey(src));
if (dst == null) {
return null;
}
// 09-Aug-2015, tatu: Instead of direct call via JavaType, better use TypeFactory
return config.getTypeFactory().constructSpecializedType(type, dst);
}
@Override
public BasicBeanDescription forDeserializationWithBuilder(DeserializationConfig cfg,
JavaType type, MixInResolver r)
{
// no std JDK types with Builders, so:
BasicBeanDescription desc = BasicBeanDescription.forDeserialization(collectPropertiesWithBuilder(cfg,
type, r, false));
// this is still a superset of "forClassAnnotations", so may optimize by optional add:
_cachedFCA.putIfAbsent(type, desc);
return desc;
}
@Override
public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) {
JavaType intType = config.constructType(Integer.TYPE);
JavaType longType = config.constructType(Long.TYPE);
return new SettableBeanProperty[] {
creatorProp("sourceRef", config.constructType(Object.class), 0),
creatorProp("byteOffset", longType, 1),
creatorProp("charOffset", longType, 2),
creatorProp("lineNr", intType, 3),
creatorProp("columnNr", intType, 4)
};
}
@Override
public JsonDeserializer<?> findBeanDeserializer(
JavaType type, DeserializationConfig config, BeanDescription beanDesc
) {
if (type.hasRawClass(InterledgerAddress.class)) {
return new InterledgerAddressDeserializer();
}
if (type.hasRawClass(InterledgerAddressPrefix.class)) {
return new InterledgerAddressPrefixDeserializer();
}
if (type.hasRawClass(InterledgerCondition.class)) {
return new ConditionDeserializer(cryptoConditionEncoding);
}
if (type.hasRawClass(InterledgerFulfillment.class)) {
return new FulfillmentDeserializer(cryptoConditionEncoding);
}
if (type.hasRawClass(SharedSecret.class)) {
return new SharedSecretDeserializer();
}
if (type.hasRawClass(LinkId.class)) {
return new LinkIdDeserializer();
}
if (type.hasRawClass(LinkType.class)) {
return new LinkTypeDeserializer();
}
return null;
}
@Override
@Nullable
public JsonDeserializer<?> findBeanDeserializer(
JavaType type, DeserializationConfig config, BeanDescription beanDesc) {
if (Message.class.isAssignableFrom(type.getRawClass())) {
return new MessageDeserializer(type.getRawClass());
}
return null;
}
/**
* Creates a BeanDeserializerModifier that replaces the
* SettableBeanProperties in the BeanDeserializerBuilder with
* ErrorReportingSettableBeanProperty instances that forward
* information about errors when setting bean properties to the
* given consumer. (Don't ask ... )
*
* @param jsonErrorConsumer The consumer for {@link JsonError}s.
* If this is <code>null</code>, then no errors will be reported.
* @return The modifier
*/
private static BeanDeserializerModifier
createErrorHandlingBeanDeserializerModifier(
Consumer<? super JsonError> jsonErrorConsumer)
{
return new BeanDeserializerModifier()
{
@Override
public BeanDeserializerBuilder updateBuilder(
DeserializationConfig config,
BeanDescription beanDesc,
BeanDeserializerBuilder builder)
{
Iterator<SettableBeanProperty> propertiesIterator =
builder.getProperties();
while (propertiesIterator.hasNext())
{
SettableBeanProperty property = propertiesIterator.next();
SettableBeanProperty wrappedProperty =
new ErrorReportingSettableBeanProperty(
property, jsonErrorConsumer);
builder.addOrReplaceProperty(wrappedProperty, true);
}
return builder;
}
};
}