Я недавно обновился с Jackson 2.9.10 до 2.10.0 и заметил изменение в том, как классы Iterator сериализуются.
Учитывая приведенный ниже тест, вывод с 2.9.10 (с обработкой JsonTypeInfo и JsonIgnore) будет
{"@ class": "IteratorTest"}
, но с 2.10.0, JsontTypeInfo и JsonIgnore не обрабатываются и выводятся
["IteratorTest", ["one", "two"]]
Правильно ли новое поведение сериализации? Есть ли способ обойти старое поведение?
// Test class
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "@class", visible=true)
public class IteratorTest<T> implements Iterator<T> {
@JsonIgnore
private Iterator<T> iterData;
private static final ObjectMapper MAPPER = new ObjectMapper();
IteratorTest(Iterator<T> iterData) { this.iterData = iterData; }
@Override
public boolean hasNext() {
return iterData.hasNext();
}
@Override
public T next() {
return iterData.next();
}
public static void main(String[] args) throws IOException {
List<String> strings = new ArrayList<>();
strings.add("one");
strings.add("two");
IteratorTest<String> it = new IteratorTest<>(strings.iterator());
System.out.println("-- serializing --");
String s = MAPPER.writeValueAsString(it);
System.out.println(s);
}
}
// end of Test class