Я создаю сериализатор, который расширяет StdSerializer для преобразования списка объектов во множество объектов в json.
Из
List<MyParentObject> myList = new LinkedList();
public class MyParentObject{ private String nameOfObject; }
к
{
"_elementNames":['object1','object2'],
"object1":{...},
"object2":{...}
}
Он работает благодаря моему сериализатору.
public class CustomElementListSerializer extends StdSerializer<List<AbstractElement>> {
@Override
public void serialize(List<AbstractElement> elements, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
List<String> eltNames = new LinkedList<>();
System.err.println( serializerProvider.getActiveView());
jsonGenerator.writeNull();
for (AbstractElement element : elements) {
String nameProperty = Element.getElement().getElementId();
eltNames.add(nameProperty);
jsonGenerator.writeFieldName(nameProperty);
jsonGenerator.writeObject(element);
}
jsonGenerator.writeFieldName("_elementNames");
jsonGenerator.writeStartArray();
for (String eltName : eltNames) {
jsonGenerator.writeString(eltName);
}
jsonGenerator.writeEndArray();
}
}
Но я не могу одновременно использовать @JsonView. Джексон не учитывает аннотацию внутри элементов, и serializerProvider.getActiveView() потерял информацию после одного рекурсивного вызова.
Как я могу решить свою проблему. Возможно, StdSerializer - не лучшее решение. Или я скучаю по тому, как учесть JsonView внутри StdSerializer с помощью метода
jsonGenerator.writeObject(element);




Я нашел решение. Вы должны установить новый сопоставитель с конфигурацией текущего serializerProvider
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
mapper.setConfig(serializerProvider.getConfig());
jsonGenerator.setCodec(mapper);