Вам необходимо настроить десериализатор коллекции, который позаботится о дополнительной информации о типе.Массив с типом имеет общую структуру: ["java.util.collectionType", [...]]
.Для этого нам нужно использовать BeanDeserializerModifier
и пользовательские CollectionDeserializer
.Давайте начнем с пользовательского десериализатора:
class OmitListTypeJsonDeserializer extends CollectionDeserializer {
public OmitListTypeJsonDeserializer(CollectionDeserializer src) {
super(src);
}
@Override
public Collection<Object> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
p.nextToken(); // Omit array type
p.nextToken(); // Omit comma and start array
Collection<Object> collection = super.deserialize(p, ctxt);
p.nextToken(); // Omit end of array
return collection;
}
@Override
public CollectionDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {
return new OmitListTypeJsonDeserializer(super.createContextual(ctxt, property));
}
}
Модификатор десериализатора бина выглядит следующим образом:
class OmitListTypeDeserializerModifier extends BeanDeserializerModifier {
@Override
public JsonDeserializer<?> modifyCollectionDeserializer(DeserializationConfig config, CollectionType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (deserializer instanceof CollectionDeserializer) {
return new OmitListTypeJsonDeserializer((CollectionDeserializer) deserializer);
}
return deserializer;
}
}
Пример использования:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import com.fasterxml.jackson.databind.deser.std.CollectionDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.type.CollectionType;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper typeAwareMapper = new ObjectMapper();
typeAwareMapper.enable(SerializationFeature.INDENT_OUTPUT);
typeAwareMapper.enableDefaultTypingAsProperty(ObjectMapper.DefaultTyping.NON_FINAL, "@class");
String json = typeAwareMapper.writeValueAsString(new BarClass());
System.out.println(json);
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new OmitListTypeDeserializerModifier());
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
System.out.println(mapper.readValue(json, BarClass.class));
}
}
class BarClass {
private String barProp = "PROP1";
private List<BarListElement> barList = Arrays.asList(new BarListElement(), new BarListElement());
private Integer zet = 123;
// getters, setters
}
class BarListElement {
private Double sid = Math.random();
// getters, setters
}
Над кодом печатается ниже JSON
:
{
"@class" : "com.celoxity.BarClass",
"barProp" : "PROP1",
"barList" : [ "java.util.Arrays$ArrayList", [ {
"@class" : "com.celoxity.BarListElement",
"sid" : 0.09525693290513237
}, {
"@class" : "com.celoxity.BarListElement",
"sid" : 0.689909415561781
} ] ],
"zet" : 123
}
и десериализованный объект:
BarClass{barProp='PROP1', barList=[BarListElement{sid=0.09525693290513237}, BarListElement{sid=0.689909415561781}], zet=123}