![](/img/trans.png)
[英]Jackson: Deserialize JSON array from JSON object into Java List
[英]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.