package com.fasterxml.jackson.databind.ser.impl;

import com.fasterxml.jackson.core.JsonGenerator;

import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
import com.fasterxml.jackson.databind.util.NameTransformer;

import java.io.IOException;
import java.util.Set;

public class UnwrappingBeanSerializer
    extends BeanSerializerBase
    implements java.io.Serializable
{
    private static final long serialVersionUID = 1L;

    
Transformer used to add prefix and/or suffix for properties of unwrapped POJO.
/** * Transformer used to add prefix and/or suffix for properties * of unwrapped POJO. */
protected final NameTransformer _nameTransformer; /* /********************************************************** /* Life-cycle: constructors /********************************************************** */
Constructor used for creating unwrapping instance of a standard BeanSerializer
/** * Constructor used for creating unwrapping instance of a * standard <code>BeanSerializer</code> */
public UnwrappingBeanSerializer(BeanSerializerBase src, NameTransformer transformer) { super(src, transformer); _nameTransformer = transformer; } public UnwrappingBeanSerializer(UnwrappingBeanSerializer src, ObjectIdWriter objectIdWriter) { super(src, objectIdWriter); _nameTransformer = src._nameTransformer; } public UnwrappingBeanSerializer(UnwrappingBeanSerializer src, ObjectIdWriter objectIdWriter, Object filterId) { super(src, objectIdWriter, filterId); _nameTransformer = src._nameTransformer; } protected UnwrappingBeanSerializer(UnwrappingBeanSerializer src, Set<String> toIgnore) { this(src, toIgnore, null); } protected UnwrappingBeanSerializer(UnwrappingBeanSerializer src, Set<String> toIgnore, Set<String> toInclude) { super(src, toIgnore, toInclude); _nameTransformer = src._nameTransformer; } // @since 2.11.1 protected UnwrappingBeanSerializer(UnwrappingBeanSerializer src, BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) { super(src, properties, filteredProperties); _nameTransformer = src._nameTransformer; } /* /********************************************************** /* Life-cycle: factory methods, fluent factories /********************************************************** */ @Override public JsonSerializer<Object> unwrappingSerializer(NameTransformer transformer) { // !!! 23-Jan-2012, tatu: Should we chain transformers? return new UnwrappingBeanSerializer(this, transformer); } @Override public boolean isUnwrappingSerializer() { return true; // sure is } @Override public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) { return new UnwrappingBeanSerializer(this, objectIdWriter); } @Override public BeanSerializerBase withFilterId(Object filterId) { return new UnwrappingBeanSerializer(this, _objectIdWriter, filterId); } @Override // @since 2.12 protected BeanSerializerBase withByNameInclusion(Set<String> toIgnore, Set<String> toInclude) { return new UnwrappingBeanSerializer(this, toIgnore, toInclude); } @Override // @since 2.11.1 protected BeanSerializerBase withProperties(BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) { return new UnwrappingBeanSerializer(this, properties, filteredProperties); }
JSON Array output cannot be done if unwrapping operation is requested; so implementation will simply return 'this'.
/** * JSON Array output cannot be done if unwrapping operation is * requested; so implementation will simply return 'this'. */
@Override protected BeanSerializerBase asArraySerializer() { return this; } /* /********************************************************** /* JsonSerializer implementation that differs between impls /********************************************************** */
Main serialization method that will delegate actual output to configured BeanPropertyWriter instances.
/** * Main serialization method that will delegate actual output to * configured * {@link BeanPropertyWriter} instances. */
@Override public final void serialize(Object bean, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.setCurrentValue(bean); // [databind#631] if (_objectIdWriter != null) { _serializeWithObjectId(bean, gen, provider, false); return; } if (_propertyFilterId != null) { serializeFieldsFiltered(bean, gen, provider); } else { serializeFields(bean, gen, provider); } } @Override public void serializeWithType(Object bean, JsonGenerator gen, SerializerProvider provider, TypeSerializer typeSer) throws IOException { if (provider.isEnabled(SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS)) { provider.reportBadDefinition(handledType(), "Unwrapped property requires use of type information: cannot serialize without disabling `SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS`"); } gen.setCurrentValue(bean); // [databind#631] if (_objectIdWriter != null) { _serializeWithObjectId(bean, gen, provider, typeSer); return; } if (_propertyFilterId != null) { serializeFieldsFiltered(bean, gen, provider); } else { serializeFields(bean, gen, provider); } } /* /********************************************************** /* Standard methods /********************************************************** */ @Override public String toString() { return "UnwrappingBeanSerializer for "+handledType().getName(); } }