package com.fasterxml.jackson.databind.ser;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
public class TestJsonSerializeAs extends BaseMapTest
{
public interface Fooable {
public int getFoo();
}
// force use of interface
@JsonSerialize(as=Fooable.class)
public static class FooImpl implements Fooable {
@Override
public int getFoo() { return 42; }
public int getBar() { return 15; }
}
static class FooImplNoAnno implements Fooable {
@Override
public int getFoo() { return 42; }
public int getBar() { return 15; }
}
public class Fooables {
public FooImpl[] getFoos() {
return new FooImpl[] { new FooImpl() };
}
}
public class FooableWrapper {
public FooImpl getFoo() {
return new FooImpl();
}
}
// for [databind#1023]
static class FooableWithFieldWrapper {
@JsonSerialize(as=Fooable.class)
public Fooable getFoo() {
return new FooImplNoAnno();
}
}
interface Bean1178Base {
public int getA();
}
@JsonPropertyOrder({"a","b"})
static abstract class Bean1178Abstract implements Bean1178Base {
@Override
public int getA() { return 1; }
public int getB() { return 2; }
}
static class Bean1178Impl extends Bean1178Abstract {
public int getC() { return 3; }
}
static class Bean1178Wrapper {
@JsonSerialize(contentAs=Bean1178Abstract.class)
public List<Bean1178Base> values;
public Bean1178Wrapper(int count) {
values = new ArrayList<Bean1178Base>();
for (int i = 0; i < count; ++i) {
values.add(new Bean1178Impl());
}
}
}
static class Bean1178Holder {
@JsonSerialize(as=Bean1178Abstract.class)
public Bean1178Base value = new Bean1178Impl();
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectWriter WRITER = objectWriter();
public void testSerializeAsInClass() throws IOException {
assertEquals("{\"foo\":42}", WRITER.writeValueAsString(new FooImpl()));
}
public void testSerializeAsForArrayProp() throws IOException {
assertEquals("{\"foos\":[{\"foo\":42}]}",
WRITER.writeValueAsString(new Fooables()));
}
public void testSerializeAsForSimpleProp() throws IOException {
assertEquals("{\"foo\":{\"foo\":42}}",
WRITER.writeValueAsString(new FooableWrapper()));
}
// for [databind#1023]
public void testSerializeWithFieldAnno() throws IOException {
assertEquals("{\"foo\":{\"foo\":42}}",
WRITER.writeValueAsString(new FooableWithFieldWrapper()));
}
// for [databind#1178]
public void testSpecializedContentAs() throws IOException {
assertEquals(aposToQuotes("{'values':[{'a':1,'b':2}]}"),
WRITER.writeValueAsString(new Bean1178Wrapper(1)));
}
// for [databind#1231] (and continuation of [databind#1178])
public void testSpecializedAsIntermediate() throws IOException {
assertEquals(aposToQuotes("{'value':{'a':1,'b':2}}"),
WRITER.writeValueAsString(new Bean1178Holder()));
}
}