diff --git a/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaSerializers.java b/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaSerializers.java index d192df4..91287e0 100644 --- a/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaSerializers.java +++ b/src/main/java/com/fasterxml/jackson/datatype/guava/GuavaSerializers.java @@ -1,8 +1,14 @@ package com.fasterxml.jackson.datatype.guava; +import com.fasterxml.jackson.databind.ser.std.IterableSerializer; +import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.databind.util.Converter; +import com.fasterxml.jackson.databind.util.StdConverter; import com.google.common.base.Optional; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilderSpec; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Multimap; import com.google.common.collect.Range; import com.google.common.net.HostAndPort; @@ -16,8 +22,19 @@ import com.fasterxml.jackson.datatype.guava.ser.MultimapSerializer; import com.fasterxml.jackson.datatype.guava.ser.RangeSerializer; +import java.util.Iterator; + public class GuavaSerializers extends Serializers.Base { + static class FluentConverter extends StdConverter> { + static final FluentConverter instance = new FluentConverter(); + + @Override + public Iterable convert(Object value) { + return (Iterable) value; + } + } + @Override public JsonSerializer findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) { @@ -40,6 +57,14 @@ public JsonSerializer findSerializer(SerializationConfig config, JavaType typ if (CacheBuilderSpec.class.isAssignableFrom(raw) || CacheBuilder.class.isAssignableFrom(raw)) { return ToStringSerializer.instance; } + // since 2.4.5 + if (FluentIterable.class.isAssignableFrom(raw)) { + JavaType[] params = config.getTypeFactory().findTypeParameters(type, Iterable.class); + JavaType vt = (params == null || params.length != 1) ? + TypeFactory.unknownType() : params[0]; + JavaType delegate = config.getTypeFactory().constructParametricType(Iterable.class, vt); + return new StdDelegatingSerializer(FluentConverter.instance, delegate, null); + } return super.findSerializer(config, type, beanDesc); } diff --git a/src/test/java/com/fasterxml/jackson/datatype/guava/FluentIterableTest.java b/src/test/java/com/fasterxml/jackson/datatype/guava/FluentIterableTest.java index 493a424..4387a14 100644 --- a/src/test/java/com/fasterxml/jackson/datatype/guava/FluentIterableTest.java +++ b/src/test/java/com/fasterxml/jackson/datatype/guava/FluentIterableTest.java @@ -14,14 +14,12 @@ public class FluentIterableTest extends ModuleTestBase { private final ObjectMapper MAPPER = mapperWithModule(); - FluentIterable createFluentIterable() { - return new FluentIterable() { - private final Iterable _iterable = Sets.newHashSet(1, 2, 3); - @Override - public Iterator iterator() { - return _iterable.iterator(); - } - }; + public static class FluentHolder { + public final Iterable value = createFluentIterable(); + } + + static FluentIterable createFluentIterable() { + return FluentIterable.from(Sets.newHashSet(1, 2, 3)); } /** @@ -31,15 +29,20 @@ public Iterator iterator() { */ public void testSerializationWithoutModule() throws Exception { ObjectMapper mapper = new ObjectMapper(); - Iterable fluentIterable = createFluentIterable(); - String json = mapper.writeValueAsString(fluentIterable); - assertEquals("{\"empty\":false}", json); + FluentHolder holder = new FluentHolder(); + String json = mapper.writeValueAsString(holder); + assertEquals("{\"value\":{\"empty\":false}}", json); } public void testSerialization() throws Exception { - Iterable fluentIterable = createFluentIterable(); - String json = MAPPER.writeValueAsString(fluentIterable); + String json = MAPPER.writeValueAsString(createFluentIterable()); assertEquals("[1,2,3]", json); } + public void testWrappedSerialization() throws Exception { + FluentHolder holder = new FluentHolder(); + String json = MAPPER.writeValueAsString(holder); + assertEquals("{\"value\":[1,2,3]}", json); + } + }