JsonValueSerializer
Date: 2016-12-04

com.fasterxml.jackson.databind.ser.std

## Class JsonValueSerializer

- java.lang.Object
- - com.fasterxml.jackson.databind.JsonSerializer<T>
  - - com.fasterxml.jackson.databind.ser.std.StdSerializer<java.lang.Object>
    - - com.fasterxml.jackson.databind.ser.std.JsonValueSerializer

- All Implemented Interfaces:
    JsonFormatVisitable, SchemaAware, ContextualSerializer, java.io.Serializable

      public class JsonValueSerializer
      extends StdSerializer<java.lang.Object>
      implements ContextualSerializer, JsonFormatVisitable, SchemaAware

  Serializer class that can serialize Object that have a `JsonValue` annotation to indicate that serialization should be done by calling the method annotated, and serializing result it returns.

  Implementation note: we will post-process resulting serializer (much like what is done with `BeanSerializer`) to figure out actual serializers for final types. This must be done from `createContextual(com.fasterxml.jackson.databind.SerializerProvider, com.fasterxml.jackson.databind.BeanProperty)` method, and NOT from constructor; otherwise we could end up with an infinite loop.

  See Also:
    Serialized Form

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class com.fasterxml.jackson.databind.JsonSerializer

      `JsonSerializer.None`

  - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `protected AnnotatedMethod` | `_accessorMethod`
    `protected boolean` | `_forceTypeInformation` This is a flag that is set in rare (?) cases where this serializer is used for "natural" types (boolean, int, String, double); and where we actually must force type information wrapping, even though one would not normally be added.
    `protected BeanProperty` | `_property`
    `protected JsonSerializer<java.lang.Object>` | `_valueSerializer`

    - ### Fields inherited from class com.fasterxml.jackson.databind.ser.std.StdSerializer

      `_handledType`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `JsonValueSerializer(AnnotatedMethod valueMethod, JsonSerializer<?> ser)`
    `JsonValueSerializer(JsonValueSerializer src, BeanProperty property, JsonSerializer<?> ser, boolean forceTypeInfo)`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected boolean` | `_acceptJsonFormatVisitorForEnum(JsonFormatVisitorWrapper visitor, JavaType typeHint, java.lang.Class<?> enumType)` Overridable helper method used for special case handling of schema information for Enums.
    `void` | `acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor, JavaType typeHint)` Default implementation specifies no format.
    `JsonSerializer<?>` | `createContextual(SerializerProvider provider, BeanProperty property)` We can try to find the actual serializer for value, if we can statically figure out what the result type must be.
    `JsonNode` | `getSchema(SerializerProvider provider, java.lang.reflect.Type typeHint)` Default implementation simply claims type is "string"; usually overriden by custom serializers.
    `protected boolean` | `isNaturalTypeWithStdHandling(java.lang.Class<?> rawType, JsonSerializer<?> ser)`
    `void` | `serialize(java.lang.Object bean, com.fasterxml.jackson.core.JsonGenerator gen, SerializerProvider prov)` Method that can be called to ask implementation to serialize values of type this serializer handles.
    `void` | `serializeWithType(java.lang.Object bean, com.fasterxml.jackson.core.JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer0)` Method that can be called to ask implementation to serialize values of type this serializer handles, using specified type serializer for embedding necessary type information.
    `java.lang.String` | `toString()`
    `JsonValueSerializer` | `withResolved(BeanProperty property, JsonSerializer<?> ser, boolean forceTypeInfo)`

    - ### Methods inherited from class com.fasterxml.jackson.databind.ser.std.StdSerializer

      `createObjectNode, createSchemaNode, createSchemaNode, findAnnotatedContentSerializer, findConvertingContentSerializer, findFormatFeature, findFormatOverrides, findIncludeOverrides, findPropertyFilter, getSchema, handledType, isDefaultSerializer, visitArrayFormat, visitArrayFormat, visitFloatFormat, visitIntFormat, visitIntFormat, visitStringFormat, visitStringFormat, wrapAndThrow, wrapAndThrow`

    - ### Methods inherited from class com.fasterxml.jackson.databind.JsonSerializer

      `getDelegatee, isEmpty, isEmpty, isUnwrappingSerializer, properties, replaceDelegatee, unwrappingSerializer, usesObjectId, withFilterId`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

    - ### Methods inherited from interface com.fasterxml.jackson.databind.jsonschema.SchemaAware

      `getSchema`

- - ### Field Detail

    - #### _accessorMethod

          protected final AnnotatedMethod _accessorMethod

      Since:
        2.8 (was "plain" method before)

    - #### _valueSerializer

          protected final JsonSerializer<java.lang.Object> _valueSerializer

    - #### _property

          protected final BeanProperty _property

    - #### _forceTypeInformation

          protected final boolean _forceTypeInformation

      This is a flag that is set in rare (?) cases where this serializer is used for "natural" types (boolean, int, String, double); and where we actually must force type information wrapping, even though one would not normally be added.

  - ### Constructor Detail

    - #### JsonValueSerializer

          public JsonValueSerializer(AnnotatedMethod valueMethod,
                             JsonSerializer<?> ser)

      Parameters:
        `ser` - Explicit serializer to use, if caller knows it (which occurs if and only if the "value method" was annotated with `JsonSerialize.using()`), otherwise null
      Since:
        2.8 Earlier method took "raw" Method, but that does not work with access to information we need

    - #### JsonValueSerializer

          public JsonValueSerializer(JsonValueSerializer src,
                             BeanProperty property,
                             JsonSerializer<?> ser,
                             boolean forceTypeInfo)

  - ### Method Detail

    - #### withResolved

          public JsonValueSerializer withResolved(BeanProperty property,
                                         JsonSerializer<?> ser,
                                         boolean forceTypeInfo)

    - #### createContextual

          public JsonSerializer<?> createContextual(SerializerProvider provider,
                                           BeanProperty property)
                                             throws JsonMappingException

      We can try to find the actual serializer for value, if we can statically figure out what the result type must be.
      Specified by:
        `createContextual` in interface `ContextualSerializer`
      Parameters:
        `provider` - Serializer provider to use for accessing config, other serializers
        `property` - Method or field that represents the property (and is used to access value to serialize). Should be available; but there may be cases where caller can not provide it and null is passed instead (in which case impls usually pass 'this' serializer as is)
      Returns:
        Serializer to use for serializing values of specified property; may be this instance or a new instance.
      Throws:
        `JsonMappingException`

    - #### serialize

          public void serialize(java.lang.Object bean,
                       com.fasterxml.jackson.core.JsonGenerator gen,
                       SerializerProvider prov)
                         throws java.io.IOException

      Description copied from class: `JsonSerializer`
      Method that can be called to ask implementation to serialize values of type this serializer handles.
      Specified by:
        `serialize` in class `StdSerializer<java.lang.Object>`
      Parameters:
        `bean` - Value to serialize; can not be null.
        `gen` - Generator used to output resulting Json content
        `prov` - Provider that can be used to get serializers for serializing Objects value contains, if any.
      Throws:
        `java.io.IOException`

    - #### serializeWithType

          public void serializeWithType(java.lang.Object bean,
                               com.fasterxml.jackson.core.JsonGenerator gen,
                               SerializerProvider provider,
                               TypeSerializer typeSer0)
                                 throws java.io.IOException

      Description copied from class: `JsonSerializer`
      Method that can be called to ask implementation to serialize values of type this serializer handles, using specified type serializer for embedding necessary type information.

      Default implementation will throw `UnsupportedOperationException` to indicate that proper type handling needs to be implemented.

      For simple datatypes written as a single scalar value (JSON String, Number, Boolean), implementation would look like:

            // note: method to call depends on whether this type is serialized as JSON scalar, object or Array!
            typeSer.writeTypePrefixForScalar(value, gen);
            serialize(value, gen, provider);
            typeSer.writeTypeSuffixForScalar(value, gen);

      and implementations for type serialized as JSON Arrays or Objects would differ slightly, as `START-ARRAY`/`END-ARRAY` and `START-OBJECT`/`END-OBJECT` pairs need to be properly handled with respect to serializing of contents.
      Overrides:
        `serializeWithType` in class `JsonSerializer<java.lang.Object>`
      Parameters:
        `bean` - Value to serialize; can not be null.
        `gen` - Generator used to output resulting Json content
        `provider` - Provider that can be used to get serializers for serializing Objects value contains, if any.
        `typeSer0` - Type serializer to use for including type information
      Throws:
        `java.io.IOException`

    - #### getSchema

          public JsonNode getSchema(SerializerProvider provider,
                           java.lang.reflect.Type typeHint)
                             throws JsonMappingException

      Description copied from class: `StdSerializer`
      Default implementation simply claims type is "string"; usually overriden by custom serializers.
      Specified by:
        `getSchema` in interface `SchemaAware`
      Overrides:
        `getSchema` in class `StdSerializer<java.lang.Object>`
      Parameters:
        `provider` - The serializer provider.
        `typeHint` - A hint about the type.
      Returns:
        Json-schema for this serializer.
      Throws:
        `JsonMappingException`

    - #### acceptJsonFormatVisitor

          public void acceptJsonFormatVisitor(JsonFormatVisitorWrapper visitor,
                                     JavaType typeHint)
                                       throws JsonMappingException

      Description copied from class: `StdSerializer`
      Default implementation specifies no format. This behavior is usually overriden by custom serializers.
      Specified by:
        `acceptJsonFormatVisitor` in interface `JsonFormatVisitable`
      Overrides:
        `acceptJsonFormatVisitor` in class `StdSerializer<java.lang.Object>`
        `typeHint` - Type of element (entity like property) being visited
      Throws:
        `JsonMappingException`

    - #### _acceptJsonFormatVisitorForEnum

          protected boolean _acceptJsonFormatVisitorForEnum(JsonFormatVisitorWrapper visitor,
                                                JavaType typeHint,
                                                java.lang.Class<?> enumType)
                                                     throws JsonMappingException

      Overridable helper method used for special case handling of schema information for Enums.
      Returns:
        True if method handled callbacks; false if not; in latter case caller will send default callbacks
      Throws:
        `JsonMappingException`
      Since:
        2.6

    - #### isNaturalTypeWithStdHandling

          protected boolean isNaturalTypeWithStdHandling(java.lang.Class<?> rawType,
                                             JsonSerializer<?> ser)

    - #### toString

          public java.lang.String toString()

      Overrides:
        `toString` in class `java.lang.Object`