簡體   English   中英

如何通過傑克遜的注釋定義通用列表反序列化器?

[英]How to define a generic list deserializer through annotations with Jackson?

假設我有一個具有列表屬性的對象:

public class Citizen {
    name
    List<Tickets> tickets
    List<Fines> fines
}

我想通過注釋為列表定義一個通用的自定義反序列化器:

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;
    }
}

我正在尋找一種方法來創建一個“通用”反序列化器 - 一個能夠反序列化兩種類型的列表,類似於ContextualDeserializer,用於將JSON映射到與Jackson不同類型的地圖

最后的目的是在MyListDeserializer實現自定義反序列化邏輯,以將空字符串""反序列化為空列表,但我想了解一般方法,而不僅僅是空字符串。

您可以使用@JsonDeserializer注釋的contentUsing屬性指定用於反序列化列表元素的反序列化器類。

public class Citizen {
    ...
    @JsonDeserializer(contentUsing=MyListDeserializer.class) 
    public void setTickets(List<Tickets> tickets) {
        this.tickets = tickets;
    }
}

使您的反序列化程序擴展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
            }
        }
     }

或者,如果您想要一個沒有公共基類的所有List類型的單個反序列化器,那么使用using屬性,讓MyListDeserializer擴展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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM