Skip to content

Serializing an Iterator with multiple sub-types fails after upgrading to 2.9.x #1977

@shiv-sivaram

Description

@shiv-sivaram

Hello,

I recently upgraded my jackson version 2.8.7 to 2.9.4 and serialization of an iterator with multiple sub-types seems broken.

Code to recreate the issue:

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.ArrayList;
import java.util.Iterator;

public class JacksonErrorTest {

    private static Iterator<Number> numbers;
    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static void main(String[] args) throws Exception {

        ArrayList<Number> numbersList = new ArrayList<>();
        numbersList.add(1);
        numbersList.add(1.0);
        numbers = numbersList.iterator();
        MAPPER.writeValueAsString(numbers);
    }
}

The exception stack trace is:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: java.lang.Double cannot be cast to java.lang.Integer
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._wrapAsIOE(DefaultSerializerProvider.java:509)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:482)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
	at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3893)
	at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3207)
	at JacksonErrorTest.main(JacksonErrorTest.java:21)
Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
	at com.fasterxml.jackson.databind.ser.std.NumberSerializers$IntegerSerializer.serialize(NumberSerializers.java:137)
	at com.fasterxml.jackson.databind.ser.impl.IteratorSerializer._serializeDynamicContents(IteratorSerializer.java:120)
	at com.fasterxml.jackson.databind.ser.impl.IteratorSerializer.serializeContents(IteratorSerializer.java:80)
	at com.fasterxml.jackson.databind.ser.impl.IteratorSerializer.serialize(IteratorSerializer.java:67)
	at com.fasterxml.jackson.databind.ser.impl.IteratorSerializer.serialize(IteratorSerializer.java:13)
	at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
	... 4 more

It looks like the error is on this line:
https://github.com/FasterXML/jackson-databind/blob/master/src/main/java/com/fasterxml/jackson/databind/ser/impl/IteratorSerializer.java#L109
serializers.serializerFor(cc);
should be
serializer = serializers.serializerFor(cc);

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions