blob: ae6786a153b0e5deb57a75899d70bdd443a7bf25 [file] [log] [blame]
package org.codehaus.jackson.map.jsontype.impl;
import java.io.IOException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.annotate.JsonTypeInfo.As;
import org.codehaus.jackson.map.BeanProperty;
import org.codehaus.jackson.map.jsontype.TypeIdResolver;
/**
* Type serializer that preferably embeds type information as an "external"
* type property; embedded in enclosing JSON object.
* Note that this serializer should only be used when value is being output
* at JSON Object context; otherwise it can not work reliably, and will have
* to revert operation similar to {@link AsPropertyTypeSerializer}.
*<p>
* Note that implementation of serialization is bit cumbersome as we must
* serialized external type id AFTER object; this because callback only
* occurs after field name has been written.
*
* @since 1.9
*/
public class AsExternalTypeSerializer
extends TypeSerializerBase
{
protected final String _typePropertyName;
public AsExternalTypeSerializer(TypeIdResolver idRes, BeanProperty property,
String propName)
{
super(idRes, property);
_typePropertyName = propName;
}
@Override
public String getPropertyName() { return _typePropertyName; }
@Override
public As getTypeInclusion() { return As.EXTERNAL_PROPERTY; }
@Override
public void writeTypePrefixForObject(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen);
}
@Override
public void writeTypePrefixForObject(Object value, JsonGenerator jgen, Class<?> type)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen, type);
}
@Override
public void writeTypePrefixForArray(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen);
}
@Override
public void writeTypePrefixForArray(Object value, JsonGenerator jgen, Class<?> type)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen, type);
}
@Override
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen);
}
@Override
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen, Class<?> type)
throws IOException, JsonProcessingException
{
_writePrefix(value, jgen, type);
}
@Override
public void writeTypeSuffixForObject(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writeSuffix(value, jgen);
}
@Override
public void writeTypeSuffixForArray(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writeSuffix(value, jgen);
}
@Override
public void writeTypeSuffixForScalar(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
_writeSuffix(value, jgen);
}
/*
/**********************************************************
/* Helper methods
/**********************************************************
*/
protected final void _writePrefix(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
jgen.writeStartObject();
}
protected final void _writePrefix(Object value, JsonGenerator jgen, Class<?> type)
throws IOException, JsonProcessingException
{
jgen.writeStartObject();
}
protected final void _writeSuffix(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
jgen.writeEndObject();
jgen.writeStringField(_typePropertyName, _idResolver.idFromValue(value));
}
}