package com.fasterxml.jackson.databind.ser;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.NullSerializer;
@SuppressWarnings("serial")
public class TestJsonSerialize2
extends BaseMapTest
{
static class SimpleKey {
protected final String key;
public SimpleKey(String str) { key = str; }
@Override public String toString() { return "toString:"+key; }
}
static class SimpleValue {
public final String value;
public SimpleValue(String str) { value = str; }
}
@JsonPropertyOrder({"value", "value2"})
static class ActualValue extends SimpleValue
{
public final String other = "123";
public ActualValue(String str) { super(str); }
}
static class SimpleKeySerializer extends JsonSerializer<SimpleKey> {
@Override
public void serialize(SimpleKey key, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeFieldName("key "+key.key);
}
}
static class SimpleValueSerializer extends JsonSerializer<SimpleValue> {
@Override
public void serialize(SimpleValue value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeString("value "+value.value);
}
}
@JsonSerialize(contentAs=SimpleValue.class)
static class SimpleValueList extends ArrayList<ActualValue> { }
@JsonSerialize(contentAs=SimpleValue.class)
static class SimpleValueMap extends HashMap<SimpleKey, ActualValue> { }
@JsonSerialize(contentUsing=SimpleValueSerializer.class)
static class SimpleValueListWithSerializer extends ArrayList<ActualValue> { }
@JsonSerialize(keyUsing=SimpleKeySerializer.class, contentUsing=SimpleValueSerializer.class)
static class SimpleValueMapWithSerializer extends HashMap<SimpleKey, ActualValue> { }
static class ListWrapperSimple
{
@JsonSerialize(contentAs=SimpleValue.class)
public final ArrayList<ActualValue> values = new ArrayList<ActualValue>();
public ListWrapperSimple(String value) {
values.add(new ActualValue(value));
}
}
static class ListWrapperWithSerializer
{
@JsonSerialize(contentUsing=SimpleValueSerializer.class)
public final ArrayList<ActualValue> values = new ArrayList<ActualValue>();
public ListWrapperWithSerializer(String value) {
values.add(new ActualValue(value));
}
}
static class MapWrapperSimple
{
@JsonSerialize(contentAs=SimpleValue.class)
public final HashMap<SimpleKey, ActualValue> values = new HashMap<SimpleKey, ActualValue>();
public MapWrapperSimple(String key, String value) {
values.put(new SimpleKey(key), new ActualValue(value));
}
}
static class MapWrapperWithSerializer
{
@JsonSerialize(keyUsing=SimpleKeySerializer.class, contentUsing=SimpleValueSerializer.class)
public final HashMap<SimpleKey, ActualValue> values = new HashMap<SimpleKey, ActualValue>();
public MapWrapperWithSerializer(String key, String value) {
values.put(new SimpleKey(key), new ActualValue(value));
}
}
static class NullBean
{
@JsonSerialize(using=NullSerializer.class)
public String value = "abc";
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
// test value annotation applied to List value class
public void testSerializedAsListWithClassAnnotations() throws IOException
{
SimpleValueList list = new SimpleValueList();
list.add(new ActualValue("foo"));
assertEquals("[{\"value\":\"foo\"}]", MAPPER.writeValueAsString(list));
}
// test value annotation applied to Map value class
public void testSerializedAsMapWithClassAnnotations() throws IOException
{
SimpleValueMap map = new SimpleValueMap();
map.put(new SimpleKey("x"), new ActualValue("y"));
assertEquals("{\"toString:x\":{\"value\":\"y\"}}", MAPPER.writeValueAsString(map));
}
// test Serialization annotation with List
public void testSerializedAsListWithClassSerializer() throws IOException
{
ObjectMapper m = new ObjectMapper();
SimpleValueListWithSerializer list = new SimpleValueListWithSerializer();
list.add(new ActualValue("foo"));
assertEquals("[\"value foo\"]", m.writeValueAsString(list));
}
public void testSerializedAsListWithPropertyAnnotations() throws IOException
{
ListWrapperSimple input = new ListWrapperSimple("bar");
assertEquals("{\"values\":[{\"value\":\"bar\"}]}", MAPPER.writeValueAsString(input));
}
public void testSerializedAsMapWithClassSerializer() throws IOException
{
SimpleValueMapWithSerializer map = new SimpleValueMapWithSerializer();
map.put(new SimpleKey("abc"), new ActualValue("123"));
assertEquals("{\"key abc\":\"value 123\"}", MAPPER.writeValueAsString(map));
}
public void testSerializedAsMapWithPropertyAnnotations() throws IOException
{
MapWrapperSimple input = new MapWrapperSimple("a", "b");
assertEquals("{\"values\":{\"toString:a\":{\"value\":\"b\"}}}",
MAPPER.writeValueAsString(input));
}
public void testSerializedAsListWithPropertyAnnotations2() throws IOException
{
ListWrapperWithSerializer input = new ListWrapperWithSerializer("abc");
assertEquals("{\"values\":[\"value abc\"]}", MAPPER.writeValueAsString(input));
}
public void testSerializedAsMapWithPropertyAnnotations2() throws IOException
{
MapWrapperWithSerializer input = new MapWrapperWithSerializer("foo", "b");
assertEquals("{\"values\":{\"key foo\":\"value b\"}}", MAPPER.writeValueAsString(input));
}
public void testEmptyInclusionContainers() throws IOException
{
ObjectMapper defMapper = MAPPER;
ObjectMapper inclMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
ListWrapper<String> list = new ListWrapper<String>();
assertEquals("{\"list\":[]}", defMapper.writeValueAsString(list));
assertEquals("{}", inclMapper.writeValueAsString(list));
assertEquals("{}", inclMapper.writeValueAsString(new ListWrapper<String>()));
MapWrapper<String,Integer> map = new MapWrapper<String,Integer>(new HashMap<String,Integer>());
assertEquals("{\"map\":{}}", defMapper.writeValueAsString(map));
assertEquals("{}", inclMapper.writeValueAsString(map));
assertEquals("{}", inclMapper.writeValueAsString(new MapWrapper<String,Integer>(null)));
ArrayWrapper<Integer> array = new ArrayWrapper<Integer>(new Integer[0]);
assertEquals("{\"array\":[]}", defMapper.writeValueAsString(array));
assertEquals("{}", inclMapper.writeValueAsString(array));
assertEquals("{}", inclMapper.writeValueAsString(new ArrayWrapper<Integer>(null)));
}
public void testNullSerializer() throws Exception
{
String json = MAPPER.writeValueAsString(new NullBean());
assertEquals("{\"value\":null}", json);
}
}