【发布时间】:2014-02-19 00:11:17
【问题描述】:
我会序列化/反序列化具有混合对象的对象数组。为此,我创建了一个 MyList 类,并用字符串、int 和日期对象填充 items-array。 使用杰克逊的序列化效果很好。 json 字符串如下所示:
{"objects":["string",123,1390859948022]}
但在反序列化时,json 字符串日期被解析为整数。所以我创建了一个自己的类 MyDate 将日期包装为字段名为“日期”的 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);
这适用于我和我的具体问题。
【问题讨论】:
-
那么你的问题是什么?
-
(请注意,JSON 没有单一定义的日期格式。两种最常见的形式是字符串(具有明显的内容)和“UNIX 纪元”值,即自 1970 年 1 月 1 日以来的毫秒数。如果您谷歌搜索“UNIX epoch”,您会发现转换器显示上述日期是星期一,2014 年 1 月 27 日 21:59:08 GMT。)
-
感谢您的评论。没错,可以使用“objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);”来代替以毫秒为单位的时间以便日期以 ISO-8601 格式序列化,例如“1970-01-01T00:00:00.000+0000”。
-
问题是,如何反序列化一个 json 字符串,以便在 MyList 的数组中是 java.util.Date-Object 而不是 LinkedHashMap 或其他东西。
标签: java arrays json jackson deserialization