blob: 80ee1f937bdf823def11a4b844d588563304391a [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 wrapper that tries to use an extra JSON Object, with a single
* entry that has type name as key, to serialize type information.
* If this is not possible (value is serialize as array or primitive),
* will use {@link As#WRAPPER_ARRAY} mechanism as fallback: that is,
* just use a wrapping array with type information as the first element
* and value as second.
*
* @since 1.5
* @author tatus
*/
public class AsWrapperTypeSerializer
extends TypeSerializerBase
{
public AsWrapperTypeSerializer(TypeIdResolver idRes, BeanProperty property)
{
super(idRes, property);
}
@Override
public As getTypeInclusion() { return As.WRAPPER_OBJECT; }
@Override
public void writeTypePrefixForObject(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// wrapper
jgen.writeStartObject();
// and then JSON Object start caller wants
jgen.writeObjectFieldStart(_idResolver.idFromValue(value));
}
@Override
public void writeTypePrefixForObject(Object value, JsonGenerator jgen,
Class<?> type)
throws IOException, JsonProcessingException
{
// wrapper
jgen.writeStartObject();
// and then JSON Object start caller wants
jgen.writeObjectFieldStart(_idResolver.idFromValueAndType(value, type));
}
@Override
public void writeTypePrefixForArray(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// can still wrap ok
jgen.writeStartObject();
// and then JSON Array start caller wants
jgen.writeArrayFieldStart(_idResolver.idFromValue(value));
}
@Override
public void writeTypePrefixForArray(Object value, JsonGenerator jgen,
Class<?> type)
throws IOException, JsonProcessingException
{
// can still wrap ok
jgen.writeStartObject();
// and then JSON Array start caller wants
jgen.writeArrayFieldStart(_idResolver.idFromValueAndType(value, type));
}
@Override
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// can still wrap ok
jgen.writeStartObject();
jgen.writeFieldName(_idResolver.idFromValue(value));
}
@Override
public void writeTypePrefixForScalar(Object value, JsonGenerator jgen,
Class<?> type)
throws IOException, JsonProcessingException
{
// can still wrap ok
jgen.writeStartObject();
jgen.writeFieldName(_idResolver.idFromValueAndType(value, type));
}
@Override
public void writeTypeSuffixForObject(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// first close JSON Object caller used
jgen.writeEndObject();
// and then wrapper
jgen.writeEndObject();
}
@Override
public void writeTypeSuffixForArray(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// first close array caller needed
jgen.writeEndArray();
// then wrapper object
jgen.writeEndObject();
}
@Override
public void writeTypeSuffixForScalar(Object value, JsonGenerator jgen)
throws IOException, JsonProcessingException
{
// just need to close the wrapper object
jgen.writeEndObject();
}
}