
org.testifyproject.fasterxml.jackson.databind.JsonDeserializer Maven / Gradle / Ivy
package org.testifyproject.testifyproject.fasterxml.jackson.databind;
import java.org.testifyproject.testifyproject.IOException;
import java.util.Collection;
import org.testifyproject.testifyproject.fasterxml.jackson.core.*;
import org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.BeanDeserializerFactory;
import org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.SettableBeanProperty;
import org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.impl.ObjectIdReader;
import org.testifyproject.testifyproject.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import org.testifyproject.testifyproject.fasterxml.jackson.databind.util.NameTransformer;
/**
* Abstract class that org.testifyproject.testifyprojectfines API used by {@link ObjectMapper} (and
* other chained {@link JsonDeserializer}s too) to org.testifyproject.testifyprojectserialize Objects of
* arbitrary types from JSON, using provided {@link JsonParser}.
*
* Custom org.testifyproject.testifyprojectserializers should usually not directly extend this class,
* but instead extend {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.std.StdDeserializer}
* (or its subtypes like {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.std.StdScalarDeserializer}).
*
* If org.testifyproject.testifyprojectserializer is an aggregate one -- meaning it org.testifyproject.testifyprojectlegates handling of some
* of its contents by using other org.testifyproject.testifyprojectserializer(s) -- it typically also needs
* to implement {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ResolvableDeserializer},
* which can locate org.testifyproject.testifyprojectpendant org.testifyproject.testifyprojectserializers. This is important to allow dynamic
* overrides of org.testifyproject.testifyprojectserializers; separate call interface is needed to separate
* resolution of org.testifyproject.testifyprojectpendant org.testifyproject.testifyprojectserializers (which may have cyclic link back
* to org.testifyproject.testifyprojectserializer itself, directly or indirectly).
*
* In addition, to support per-property annotations (to configure aspects
* of org.testifyproject.testifyprojectserialization on per-property basis), org.testifyproject.testifyprojectserializers may want
* to implement
* {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ContextualDeserializer},
* which allows specialization of org.testifyproject.testifyprojectserializers: call to
* {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ContextualDeserializer#createContextual}
* is passed information on property, and can create a newly configured
* org.testifyproject.testifyprojectserializer for handling that particular property.
*
* If both
* {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ResolvableDeserializer} and
* {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ContextualDeserializer}
* are implemented, resolution of org.testifyproject.testifyprojectserializers occurs before
* contextualization.
*/
public abstract class JsonDeserializer
{
/*
/**********************************************************
/* Main org.testifyproject.testifyprojectserialization methods
/**********************************************************
*/
/**
* Method that can be called to ask implementation to org.testifyproject.testifyprojectserialize
* JSON content into the value type this serializer handles.
* Returned instance is to be constructed by method itself.
*
* Pre-condition for this method is that the parser points to the
* first event that is part of value to org.testifyproject.testifyprojectserializer (and which
* is never JSON 'null' literal, more on this below): for simple
* types it may be the only value; and for structured types the
* Object start marker or a FIELD_NAME.
*
*
* The two possible input conditions for structured types result
* from polymorphism via fields. In the ordinary case, Jackson
* calls this method when it has encountered an OBJECT_START,
* and the method implementation must advance to the next token to
* see the first field name. If the application configures
* polymorphism via a field, then the object looks like the following.
*
* {
* "@class": "class name",
* ...
* }
*
* Jackson consumes the two tokens (the @class field name
* and its value) in order to learn the class and select the org.testifyproject.testifyprojectserializer.
* Thus, the stream is pointing to the FIELD_NAME for the first field
* after the @class. Thus, if you want your method to work correctly
* both with and without polymorphism, you must begin your method with:
*
* if (jp.getCurrentToken() == JsonToken.START_OBJECT) {
* jp.nextToken();
* }
*
* This results in the stream pointing to the field name, so that
* the two conditions align.
*
* Post-condition is that the parser will point to the last
* event that is part of org.testifyproject.testifyprojectserialized value (or in case org.testifyproject.testifyprojectserialization
* fails, event that was not recognized or usable, which may be
* the same event as the one it pointed to upon call).
*
* Note that this method is never called for JSON null literal,
* and thus org.testifyproject.testifyprojectserializers need (and should) not check for it.
*
* @param p Parsed used for reading JSON content
* @param ctxt Context that can be used to access information about
* this org.testifyproject.testifyprojectserialization activity.
*
* @return Deserialized value
*/
public abstract T org.testifyproject.testifyprojectserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
/**
* Alternate org.testifyproject.testifyprojectserialization method (org.testifyproject.testifyprojectpared to the most org.testifyproject.testifyprojectmonly
* used, {@link #org.testifyproject.testifyprojectserialize(JsonParser, DeserializationContext)}),
* which takes in initialized value instance, to be
* configured and/or populated by org.testifyproject.testifyprojectserializer.
* Method is not necessarily used (or supported) by all types
* (it will not work for immutable types, for obvious reasons):
* most org.testifyproject.testifyprojectmonly it is used for Collections and Maps.
* It may be used both with "updating readers" (for POJOs) and
* when Collections and Maps use "getter as setter".
*
* Default implementation just throws
* {@link UnsupportedOperationException}, to indicate that types
* that do not explicitly add support do not necessarily support
* update-existing-value operation (esp. immutable types)
*/
public T org.testifyproject.testifyprojectserialize(JsonParser p, DeserializationContext ctxt, T intoValue)
throws IOException, JsonProcessingException
{
throw new UnsupportedOperationException("Can not update object of type "
+intoValue.getClass().getName()+" (by org.testifyproject.testifyprojectserializer of type "+getClass().getName()+")");
}
/**
* Deserialization called when type being org.testifyproject.testifyprojectserialized is org.testifyproject.testifyprojectfined to
* contain additional type identifier, to allow for correctly
* instantiating correct subtype. This can be due to annotation on
* type (or its supertype), or due to global settings without
* annotations.
*
* Default implementation may work for some types, but ideally subclasses
* should not rely on current org.testifyproject.testifyprojectfault implementation.
* Implementation is mostly provided to avoid org.testifyproject.testifyprojectpilation errors with older
* code.
*
* @param typeDeserializer Deserializer to use for handling type information
*/
public Object org.testifyproject.testifyprojectserializeWithType(JsonParser p, DeserializationContext ctxt,
TypeDeserializer typeDeserializer)
throws IOException
{
// We could try calling
return typeDeserializer.org.testifyproject.testifyprojectserializeTypedFromAny(p, ctxt);
}
/*
/**********************************************************
/* Fluent factory methods for constructing org.testifyproject.testifyprojectcorated versions
/**********************************************************
*/
/**
* Method that will return org.testifyproject.testifyprojectserializer instance that is able
* to handle "unwrapped" value instances
* If no unwrapped instance can be constructed, will simply
* return this object as-is.
*
* Default implementation just returns 'this'
* indicating that no unwrapped variant exists
*/
public JsonDeserializer unwrappingDeserializer(NameTransformer unwrapper) {
return this;
}
/**
* Method that can be called to try to replace org.testifyproject.testifyprojectserializer this org.testifyproject.testifyprojectserializer
* org.testifyproject.testifyprojectlegates calls to. If not supported (either this org.testifyproject.testifyprojectserializer does not
* org.testifyproject.testifyprojectlegate anything; or it does not want any changes), should either
* throw {@link UnsupportedOperationException} (if operation does not
* make sense or is not allowed); or return this org.testifyproject.testifyprojectserializer as is.
*
* @since 2.1
*/
public JsonDeserializer> replaceDelegatee(JsonDeserializer> org.testifyproject.testifyprojectlegatee) {
throw new UnsupportedOperationException();
}
/*
/**********************************************************
/* Introspection methods for figuring out configuration/setup
/* of this org.testifyproject.testifyprojectserializer instance and/or type it handles
/**********************************************************
*/
/**
* Method for accessing type of values this org.testifyproject.testifyprojectserializer produces.
* Note that this information is not guaranteed to be exact -- it
* may be a more generic (super-type) -- but it should not be
* incorrect (return a non-related type).
*
* Default implementation will return null, which means almost same
* same as returning Object.class
would; that is, that
* nothing is known about handled type.
*
* @since 2.3
*/
public Class> handledType() { return null; }
/**
* Method called to see if org.testifyproject.testifyprojectserializer instance is cachable and
* usable for other properties of same type (type for which instance
* was created).
*
* Note that cached instances are still resolved on per-property basis,
* if instance implements {@link org.testifyproject.testifyproject.fasterxml.jackson.databind.org.testifyproject.testifyprojectser.ResolvableDeserializer}:
* cached instance is just as the base. This means that in most cases it is safe to
* cache instances; however, it only makes sense to cache instances
* if instantiation is expensive, or if instances are heavy-weight.
*
* Default implementation returns false, to indicate that no caching
* is done.
*/
public boolean isCachable() { return false; }
/**
* Accessor that can be used to org.testifyproject.testifyprojecttermine if this org.testifyproject.testifyprojectserializer uses
* another org.testifyproject.testifyprojectserializer for actual org.testifyproject.testifyprojectserialization, by org.testifyproject.testifyprojectlegating
* calls. If so, will return immediate org.testifyproject.testifyprojectlegate (which itself may
* org.testifyproject.testifyprojectlegate to further org.testifyproject.testifyprojectserializers); otherwise will return null.
*
* @return Deserializer this org.testifyproject.testifyprojectserializer org.testifyproject.testifyprojectlegates calls to, if null;
* null otherwise.
*
* @since 2.1
*/
public JsonDeserializer> getDelegatee() {
return null;
}
/**
* Method that will
* either return null to indicate that type being org.testifyproject.testifyprojectserializers
* has no concept of properties; or a collection of identifiers
* for which toString
will give external property
* name.
* This is only to be used for error reporting and diagnostics
* purposes (most org.testifyproject.testifyprojectmonly, to accompany "unknown property"
* exception).
*
* @since 2.0
*/
public Collection