package com.fasterxml.jackson.databind.convert;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.util.StdConverter;
public class TestConvertingSerializer
extends com.fasterxml.jackson.databind.BaseMapTest
{
@JsonSerialize(converter=ConvertingBeanConverter.class)
static class ConvertingBean
{
public int x, y;
public ConvertingBean(int v1, int v2) {
x = v1;
y = v2;
}
}
static class Point
{
public int x, y;
public Point(int v1, int v2) {
x = v1;
y = v2;
}
}
static class ConvertingBeanContainer
{
public List<ConvertingBean> values;
public ConvertingBeanContainer(ConvertingBean... beans) {
values = Arrays.asList(beans);
}
}
static class ConvertingBeanConverter extends StdConverter<ConvertingBean, int[]>
{
@Override
public int[] convert(ConvertingBean value) {
return new int[] { value.x, value.y };
}
}
static class PointConverter extends StdConverter<Point, int[]>
{
@Override public int[] convert(Point value) {
return new int[] { value.x, value.y };
}
}
static class PointWrapper {
@JsonSerialize(converter=PointConverter.class)
public Point value;
public PointWrapper(int x, int y) {
value = new Point(x, y);
}
}
static class PointListWrapperArray {
@JsonSerialize(contentConverter=PointConverter.class)
public Point[] values;
public PointListWrapperArray(int x, int y) {
values = new Point[] { new Point(x, y), new Point(y, x) };
}
}
static class PointListWrapperList {
@JsonSerialize(contentConverter=PointConverter.class)
public List<Point> values;
public PointListWrapperList(int x, int y) {
values = Arrays.asList(new Point[] { new Point(x, y), new Point(y, x) });
}
}
static class PointListWrapperMap {
@JsonSerialize(contentConverter=PointConverter.class)
public Map<String,Point> values;
public PointListWrapperMap(String key, int x, int y) {
values = new HashMap<String,Point>();
values.put(key, new Point(x, y));
}
}
// [databind#357]
static class Value { }
static class ListWrapper {
@JsonSerialize(contentConverter = ValueToStringListConverter.class)
public List<Value> list = Arrays.asList(new Value());
}
static class ValueToStringListConverter extends StdConverter<Value, List<String>> {
@Override
public List<String> convert(Value value) {
return Arrays.asList("Hello world!");
}
}
// [databind#359]
static class Bean359 {
@JsonSerialize(as = List.class, contentAs = Source.class)
public List<Source> stuff = Arrays.asList(new Source());
}
@JsonSerialize(using = TargetSerializer.class)
static class Target {
public String unexpected = "Bye.";
}
@JsonSerialize(converter = SourceToTargetConverter.class)
static class Source { }
static class SourceToTargetConverter extends StdConverter<Source, Target> {
@Override
public Target convert(Source value) {
return new Target();
}
}
static class TargetSerializer extends JsonSerializer<Target>
{
@Override
public void serialize(Target a, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException {
jsonGenerator.writeString("Target");
}
}
// [databind#731]
public static class DummyBean {
public final int a, b;
public DummyBean(int v1, int v2) {
a = v1 * 2;
b = v2 * 2;
}
}
@JsonSerialize(converter = UntypedConvertingBeanConverter.class)
static class ConvertingBeanWithUntypedConverter {
public int x, y;
public ConvertingBeanWithUntypedConverter(int v1, int v2) {
x = v1;
y = v2;
}
}
static class UntypedConvertingBeanConverter extends StdConverter<ConvertingBeanWithUntypedConverter, Object>
{
@Override
public Object convert(ConvertingBeanWithUntypedConverter cb) {
return new DummyBean(cb.x, cb.y);
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
public void testClassAnnotationSimple() throws Exception
{
String json = objectWriter().writeValueAsString(new ConvertingBean(1, 2));
assertEquals("[1,2]", json);
}
public void testClassAnnotationForLists() throws Exception
{
String json = objectWriter().writeValueAsString(new ConvertingBeanContainer(
new ConvertingBean(1, 2), new ConvertingBean(3, 4)));
assertEquals("{\"values\":[[1,2],[3,4]]}", json);
}
public void testPropertyAnnotationSimple() throws Exception
{
String json = objectWriter().writeValueAsString(new PointWrapper(3, 4));
assertEquals("{\"value\":[3,4]}", json);
}
public void testPropertyAnnotationForArrays() throws Exception {
String json = objectWriter().writeValueAsString(new PointListWrapperArray(4, 5));
assertEquals("{\"values\":[[4,5],[5,4]]}", json);
}
public void testPropertyAnnotationForLists() throws Exception {
String json = objectWriter().writeValueAsString(new PointListWrapperList(7, 8));
assertEquals("{\"values\":[[7,8],[8,7]]}", json);
}
public void testPropertyAnnotationForMaps() throws Exception {
String json = objectWriter().writeValueAsString(new PointListWrapperMap("a", 1, 2));
assertEquals("{\"values\":{\"a\":[1,2]}}", json);
}
// [databind#357]
public void testConverterForList357() throws Exception {
String json = objectWriter().writeValueAsString(new ListWrapper());
assertEquals("{\"list\":[[\"Hello world!\"]]}", json);
}
// [databind#359]
public void testIssue359() throws Exception {
String json = objectWriter().writeValueAsString(new Bean359());
assertEquals("{\"stuff\":[\"Target\"]}", json);
}
// [databind#731]: Problems converting from java.lang.Object ("unknown")
public void testIssue731() throws Exception
{
String json = objectWriter().writeValueAsString(new ConvertingBeanWithUntypedConverter(1, 2));
// must be {"a":2,"b":4}
assertEquals("{\"a\":2,\"b\":4}", json);
}
}