package com.fasterxml.jackson.datatype.jsr353;
import java.io.IOException;
import java.util.Map;
import javax.json.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.type.WritableTypeId;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class JsonValueSerializer extends StdSerializer<JsonValue>
{
private static final long serialVersionUID = 1L;
public JsonValueSerializer() {
super(JsonValue.class);
}
@Override
public void serialize(JsonValue value, JsonGenerator g, SerializerProvider provider)
throws IOException
{
switch (value.getValueType()) {
case ARRAY:
g.writeStartArray();
serializeArrayContents((JsonArray) value, g, provider);
g.writeEndArray();
break;
case OBJECT:
g.writeStartObject(value);
serializeObjectContents((JsonObject) value, g, provider);
g.writeEndObject();
break;
default:
serializeScalar(value, g, provider);
}
}
@Override
public void serializeWithType(JsonValue value, JsonGenerator g, SerializerProvider provider,
TypeSerializer typeSer)
throws IOException
{
g.setCurrentValue(value);
WritableTypeId typeIdDef = typeSer.writeTypePrefix(g,
typeSer.typeId(value, JsonValue.class, JsonToken.VALUE_EMBEDDED_OBJECT));
serialize(value, g, provider);
typeSer.writeTypeSuffix(g, typeIdDef);
}
protected void serializeScalar(JsonValue value,
JsonGenerator g, SerializerProvider provider)
throws IOException
{
switch (value.getValueType()) {
case FALSE:
g.writeBoolean(false);
break;
case NULL:
g.writeNull();
break;
case NUMBER:
{
JsonNumber num = (JsonNumber) value;
if (num.isIntegral()) {
g.writeNumber(num.longValue());
} else {
g.writeNumber(num.bigDecimalValue());
}
}
break;
case STRING:
g.writeString(((JsonString) value).getString());
break;
case TRUE:
g.writeBoolean(true);
break;
default:
break;
}
}
protected void serializeArrayContents(JsonArray values,
JsonGenerator g, SerializerProvider provider)
throws IOException
{
if (!values.isEmpty()) {
for (JsonValue value : values) {
serialize(value, g, provider);
}
}
}
protected void serializeObjectContents(JsonObject ob,
JsonGenerator g, SerializerProvider provider)
throws IOException
{
if (!ob.isEmpty()) {
for (Map.Entry<String, JsonValue> entry : ob.entrySet()) {
g.writeFieldName(entry.getKey());
serialize(entry.getValue(), g, provider);
}
}
}
}