blob: 6a147633a9844a4b4f996374aee69964718ac59b [file] [log] [blame]
package org.codehaus.jackson.map;
import java.io.IOException;
import org.codehaus.jackson.*;
import org.codehaus.jackson.annotate.JsonTypeInfo.As;
import org.codehaus.jackson.map.jsontype.TypeIdResolver;
/**
* Interface for deserializing type information from JSON content, to
* type-safely deserialize data into correct polymorphic instance
* (when type inclusion has been enabled for type handled).
*<p>
* Separate deserialization methods are needed because serialized
* form for inclusion mechanism {@link As#PROPERTY}
* is slighty different if value is not expressed as JSON Object:
* and as such both type deserializer and serializer need to
* JSON Object form (array, object or other (== scalar)) being
* used.
*
* @since 1.5
* @author tatus
*/
public abstract class TypeDeserializer
{
/*
/**********************************************************
/* Introspection
/**********************************************************
*/
/**
* Accessor for type information inclusion method
* that deserializer uses; indicates how type information
* is (expected to be) embedded in JSON input.
*/
public abstract As getTypeInclusion();
/**
* Name of property that contains type information, if
* property-based inclusion is used.
*/
public abstract String getPropertyName();
/**
* Accessor for object that handles conversions between
* types and matching type ids.
*/
public abstract TypeIdResolver getTypeIdResolver();
/**
* Accessor for "default implementation" type; optionally defined
* class to use in cases where type id is not
* accessible for some reason (either missing, or can not be
* resolved)
*
* @since 1.9
*/
public abstract Class<?> getDefaultImpl();
/*
/*********************************************************
/* Type deserialization methods
/**********************************************************
*/
/**
* Method called to let this type deserializer handle
* deserialization of "typed" object, when value itself
* is serialized as JSON Object (regardless of Java type).
* Method needs to figure out intended
* polymorphic type, locate {@link JsonDeserializer} to use, and
* call it with JSON data to deserializer (which does not contain
* type information).
*/
public abstract Object deserializeTypedFromObject(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
/**
* Method called to let this type deserializer handle
* deserialization of "typed" object, when value itself
* is serialized as JSON Array (regardless of Java type).
* Method needs to figure out intended
* polymorphic type, locate {@link JsonDeserializer} to use, and
* call it with JSON data to deserializer (which does not contain
* type information).
*/
public abstract Object deserializeTypedFromArray(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
/**
* Method called to let this type deserializer handle
* deserialization of "typed" object, when value itself
* is serialized as a scalar JSON value (something other
* than Array or Object), regardless of Java type.
* Method needs to figure out intended
* polymorphic type, locate {@link JsonDeserializer} to use, and
* call it with JSON data to deserializer (which does not contain
* type information).
*/
public abstract Object deserializeTypedFromScalar(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
/**
* Method called to let this type deserializer handle
* deserialization of "typed" object, when value itself
* may have been serialized using any kind of JSON value
* (Array, Object, scalar). Should only be called if JSON
* serialization is polymorphic (not Java type); for example when
* using JSON node representation, or "untyped" Java object
* (which may be Map, Collection, wrapper/primitive etc).
*/
public abstract Object deserializeTypedFromAny(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException;
}