ipa*_*lic 13 java spring jackson
假设我有一个具有列表属性的对象:
public class Citizen {
name
List<Tickets> tickets
List<Fines> fines
}
Run Code Online (Sandbox Code Playgroud)
我想通过注释为列表定义一个通用的自定义反序列化器:
public class Citizen {
...
@JsonDeserializer(MyListDeserializer<Tickets>) // <-- generic deserializer
public void setTickets(List<Tickets> tickets) {
this.tickets = tickets;
}
@JsonDeserializer(MyListDeserializer<Fines>) // <-- how can I do that?
public void setFines(List<Fines> fines) {
this.fines = fines;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来创建一个"泛型"反序列化器 - 一个能够反序列化两种类型的列表,类似于ContextualDeserializer,用于将JSON映射到与Jackson不同类型的映射.
最后的目的是实现自定义反序列化逻辑,MyListDeserializer将空字符串反序列""化为空列表,但我想了解一般方法,而不仅仅是空字符串.
Sum*_*ain 14
您可以使用注释的contentUsing属性指定反序列化器类,使用该类反序列化列表元素@JsonDeserializer.
public class Citizen {
...
@JsonDeserializer(contentUsing=MyListDeserializer.class)
public void setTickets(List<Tickets> tickets) {
this.tickets = tickets;
}
}
Run Code Online (Sandbox Code Playgroud)
使您的反序列化程序扩展JsonDeserializer<BaseClass>并在BaseClass中具有一个属性,该属性存储具体类的实际类型.
abstract class BaseTickets {
String ticketType;
public String getTicketType()
}
public class MyListDeserializer extends JsonDeserializer<BaseTickets> {
@Override
public BaseTickets deserialize(JsonParser jsonParser, DeserializationContext arg1) throws IOException, JsonProcessingException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
Iterator<JsonNode> elements = node.getElements();
for (; elements.hasNext();) {
String type = (String) elements.next().get("ticketType");
if (type.equals()){
//create concrete type here
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要一个没有公共基类的所有List类型的单个反序列化器,那么使用该using属性,具有MyListDeserializerextend JsonDeserialize<Object>.要确定列表元素的类型,您必须编写一个自定义序列化程序,将类型信息添加到列表中,然后可以在通用反序列化程序中使用.
public class Citizen {
...
@JsonDeserializer(using=MyListDeserializer.class)
@JsonSerializer(using=MyListSerializer.class)
public void setTickets(List<Tickets> tickets) {
this.tickets = tickets;
}
}
public class MyListSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object list, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
@SuppressWarnings("rawtypes")
jgen.writeStartObject();
String type = getListType(list);
jgen.writeStringField("listType", type);
jgen.writeObjectField("list", list)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16667 次 |
| 最近记录: |