簡體   English   中英

Jackson JSON如何從對象數組反序列化日期

[英]Jackson JSON how to deserialize date from object-array

我會使用混合對象序列化/反序列化Object-Array。 因此,我創建了一個MyList類,並使用strings,int和date-objects填充items-array。 傑克遜的序列化效果很好。 json-string看起來像這樣:

{"objects":["string",123,1390859948022]}

但是在反序列化時,json-string日期被解析為整數。 所以我創建了一個自己的類MyDate來將日期包裝為帶有字段名“date”的json對象。 新結果是:

{"objects":["string",123,1390859948022,{"date":1390859948022}]}

現在結果是LinkedHashMap。

這是我的代碼示例:

Maven的依賴關系:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.3.0</version>
    </dependency>

MyList.java

public class MyList {
    private Object[] objects;

    public MyList() {
    }

    public MyList(Object[] objects) {
        this.objects = objects;
    }

    // getter and setter
}

MyDate.java:

public class MyDate {
    private Date date;

    public MyDate() {
    }   

    public MyDate(Date date) {
        this.date = date;
    }
    // Getter and Setter
}

序列化-實施例:

public static void serializeTest() throws JsonGenerationException, JsonMappingException, IOException{
    ObjectMapper mapper = new ObjectMapper();       
    Object[] objects = {"string", 123, new Date(), new MyDate(new Date())};
    MyList liste = new MyList(objects);
    mapper.writeValue(System.out, liste);
}

反序列化-實施例:

public static void deserializeTest() throws JsonParseException,
        JsonMappingException, IOException {
    String input = "{\"objects\":[\"string\",123,1390858928698,{\"date\":1390858928698}]}";

    ObjectMapper mapper = new ObjectMapper();
    MyList list = mapper.readValue(input, MyList.class);
    System.out.println("#list:" + list);
    System.out.println("#list.getObjects:" + list.getObjects());
    for (Object i : list.getObjects()) {
        System.out.println("\t value=" + i + ", type=" + i.getClass());
    }
}

我已經找到了可能的解決方案,但沒有任何效果。 我希望有一個人可以幫助我。

非常感謝您的所有答案。 在你的幫助下,我可以解決我的問題

我不得不將JsonTypeInfo-Annotation添加到我的對象數組中:

public class MyList {
    @JsonTypeInfo(  
        use = JsonTypeInfo.Id.NAME,  
        include = JsonTypeInfo.As.WRAPPER_OBJECT)  
    @JsonSubTypes({  
        @Type(value = Date.class, name = "date")})  
    private Object[] objects;

為了解決這個問題,在其他對象數組中,我使用以下行擴展了我的代碼:

mapper.enableDefaultTyping(DefaultTyping.JAVA_LANG_OBJECT, As.WRAPPER_OBJECT);

這適用於我和我的具體問題。

閱讀多態反序列化 目前所有你告訴傑克遜的是你希望它反序列化一系列對象。 為了使其工作,您需要注釋MyDate類(或使用Annotation Mixins來注釋內置的Date類),因此Jackson在序列化日期時會輸出一些額外的類型信息。 反序列化時,Jackson將使用該信息來了解JSON對象所代表的類。

你的問題是傑克遜沒有辦法知道JSON字符串或數字應該映射到java.util.Date ,如果你說的只是“映射到java.lang.Object”。

但是你可以強制使用類型信息來實現這一點; 要使用的注釋是@JsonTypeInfo ,您可以在字段旁邊添加它,如下所示:

@JsonTypeInfo(...)
private Object[] objects;

關於日期序列化 - 請參閱http://wiki.fasterxml.com/JacksonFAQDateHandling

關於反序列化:您的屬性是通用的 - 對象[]。 從您當前的JSON中,無法確定應該實例化的Java類型。 這就是為什么JSON應該包含關於它的日期元素的其他信息,...... {@type:“date”,“date”:1390859948022} ......或者像這樣:... {“date”:{@ type: “date”,“value”:1390859948022} ...

你是怎么做到的 - 看看“dnault”之前的回答並鏈接到那里的傑克遜。

暫無
暫無

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

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