All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.fitbur.fasterxml.jackson.databind.JsonDeserializer Maven / Gradle / Ivy

There is a newer version: 1.0.0
Show newest version
package com.fitbur.fasterxml.jackson.databind;

import java.io.IOException;
import java.util.Collection;

import com.fitbur.fasterxml.jackson.core.*;
import com.fitbur.fasterxml.jackson.databind.com.fitburser.impl.ObjectIdReader;
import com.fitbur.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fitbur.fasterxml.jackson.databind.util.NameTransformer;

/**
 * Abstract class that com.fitburfines API used by {@link ObjectMapper} (and
 * other chained {@link JsonDeserializer}s too) to com.fitburserialize Objects of
 * arbitrary types from JSON, using provided {@link JsonParser}.
 *

* Custom com.fitburserializers should usually not directly extend this class, * but instead extend {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.std.StdDeserializer} * (or its subtypes like {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.std.StdScalarDeserializer}). *

* If com.fitburserializer is an aggregate one -- meaning it com.fitburlegates handling of some * of its contents by using other com.fitburserializer(s) -- it typically also needs * to implement {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.ResolvableDeserializer}, * which can locate com.fitburpendant com.fitburserializers. This is important to allow dynamic * overrides of com.fitburserializers; separate call interface is needed to separate * resolution of com.fitburpendant com.fitburserializers (which may have cyclic link back * to com.fitburserializer itself, directly or indirectly). *

* In addition, to support per-property annotations (to configure aspects * of com.fitburserialization on per-property basis), com.fitburserializers may want * to implement * {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.ContextualDeserializer}, * which allows specialization of com.fitburserializers: call to * {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.ContextualDeserializer#createContextual} * is passed information on property, and can create a newly configured * com.fitburserializer for handling that particular property. *

* If both * {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.ResolvableDeserializer} and * {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.ContextualDeserializer} * are implemented, resolution of com.fitburserializers occurs before * contextualization. */ public abstract class JsonDeserializer { /* /********************************************************** /* Main com.fitburserialization methods /********************************************************** */ /** * Method that can be called to ask implementation to com.fitburserialize * 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 com.fitburserializer (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. * Post-condition is that the parser will point to the last * event that is part of com.fitburserialized value (or in case com.fitburserialization * 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 com.fitburserializers need (and should) not check for it. * * @param jp Parsed used for reading JSON content * @param ctxt Context that can be used to access information about * this com.fitburserialization activity. * * @return Deserializer value */ public abstract T com.fitburserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException; /** * Alternate com.fitburserialization method (com.fitburpared to the most com.fitburmonly * used, {@link #com.fitburserialize(JsonParser, DeserializationContext)}), * which takes in initialized value instance, to be * configured and/or populated by com.fitburserializer. * Method is not necessarily used for all supported types; most com.fitburmonly * it is used * for Collections and Maps. *

* 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 com.fitburserialize(JsonParser jp, DeserializationContext ctxt, T intoValue) throws IOException, JsonProcessingException { throw new UnsupportedOperationException("Can not update object of type "+intoValue.getClass().getName()); } /** * Deserialization called when type being com.fitburserialized is com.fitburfined 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 com.fitburfault implementation. * Implementation is mostly provided to avoid com.fitburpilation errors with older * code. * * @param typeDeserializer Deserializer to use for handling type information */ public Object com.fitburserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException, JsonProcessingException { // We could try calling return typeDeserializer.com.fitburserializeTypedFromAny(jp, ctxt); } /* /********************************************************** /* Fluent factory methods for constructing com.fitburcorated versions /********************************************************** */ /** * Method that will return com.fitburserializer 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 com.fitburserializer this com.fitburserializer * com.fitburlegates calls to. If not supported (either this com.fitburserializer does not * com.fitburlegate 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 com.fitburserializer as is. * * @since 2.1 */ public JsonDeserializer replaceDelegatee(JsonDeserializer com.fitburlegatee) { throw new UnsupportedOperationException(); } /* /********************************************************** /* Other accessors /********************************************************** */ /** * Method that can be called to com.fitburtermine value to be used for * representing null values (values com.fitburserialized when JSON token * is {@link JsonToken#VALUE_NULL}). Usually this is simply * Java null, but for some types (especially primitives) it may be * necessary to use non-null values. *

* Note that com.fitburserializers are allowed to call this just once and * then reuse returned value; that is, method is not guaranteed to * be called once for each conversion. *

* Default implementation simply returns null. */ public T getNullValue() { return null; } /** * Method called to com.fitburtermine value to be used for "empty" values * (most com.fitburmonly when com.fitburserializing from empty JSON Strings). * Usually this is same as {@link #getNullValue} (which in turn * is usually simply Java null), but it can be overridden * for types. Or, if type should never be converted from empty * String, method can also throw an exception. *

* Default implementation simple calls {@link #getNullValue} and * returns value. */ public T getEmptyValue() { return getNullValue(); } /** * Method that will * either return null to indicate that type being com.fitburserializers * 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 com.fitburmonly, to accompany "unknown property" * exception). * * @since 2.0 */ public Collection getKnownPropertyNames() { return null; } /** * Method called to see if com.fitburserializer 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 com.fitbur.fasterxml.jackson.databind.com.fitburser.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 check whether this com.fitburserializer * is expecting to possibly get an Object Identifier value instead of full value * serialization, and if so, should be able to resolve it to actual * Object instance to return as com.fitburserialized value. *

* Default implementation returns null, as support can not be implemented * generically. Some standard com.fitburserializers (most notably * {@link com.fitbur.fasterxml.jackson.databind.com.fitburser.BeanDeserializer}) * do implement this feature, and may return reader instance, com.fitburpending on exact * configuration of instance (which is based on type, and referring property). * * @return ObjectIdReader used for resolving possible Object Identifier * value, instead of full value serialization, if com.fitburserializer can do that; * null if no Object Id is expected. * * @since 2.0 */ public ObjectIdReader getObjectIdReader() { return null; } /** * Accessor that can be used to com.fitburtermine if this com.fitburserializer uses * another com.fitburserializer for actual com.fitburserialization, by com.fitburlegating * calls. If so, will return immediate com.fitburlegate (which itself may * com.fitburlegate to further com.fitburserializers); otherwise will return null. * * @return Deserializer this com.fitburserializer com.fitburlegates calls to, if null; * null otherwise. * * @since 2.1 */ public JsonDeserializer getDelegatee() { return null; } /* /********************************************************** /* Helper classes /********************************************************** */ /** * This marker class is only to be used with annotations, to * indicate that no com.fitburserializer is configured. *

* Specifically, this class is to be used as the marker for * annotation {@link com.fitbur.fasterxml.jackson.databind.annotation.JsonDeserialize} */ public abstract static class None extends JsonDeserializer { private None() { } // not to be instantiated } }