我将用混合对象序列化/反序列化对象数组。因此,我创建了一个MyList类,并用字符串、int和date对象填充items数组。与jackson的连载效果很好。json字符串如下所示:
{"objects":["string",123,1390859948022]}
但是在反序列化时,json字符串date被解析为整数。因此,我创建了一个自己的类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>
我的列表。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注释添加到我的对象数组中:
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);
这对我和我的具体问题都有效。
关于日期序列化-请参阅http://wiki.fasterxml.com/JacksonFAQDateHandling
关于反序列化:您的属性是泛型-对象[]。根据您当前的JSON,不可能确定应该以何种Java类型实例化它。这就是为什么JSON应该包含关于其日期元素的其他信息,有点。。。{@type:“date”,“date”:1390859948022}。。。或者像这样:。。。{“date”:{@type:“date”,“value”:1390859948022}。。。
如何做到这一点-请参阅“dnault”之前的答案,并在那里链接到Jackson。
您的问题是Jackson无法知道JSON字符串或数字应该映射到java.util.Date
,如果您所说的只是映射到java.lang.对象。
但是您可以强制使用类型信息来实现这一点;要使用的注释是@JsonTypeInfo
,您可以像这样在字段旁边添加它:
@JsonTypeInfo(...)
private Object[] objects;
阅读多态反序列化。目前,你只想告诉Jackson,你希望它对一系列对象进行反序列化。为了使其工作,您需要注释MyDate类(或使用注释混合来注释内置的Date类),这样Jackson在序列化日期时会输出一些额外的类型信息。在反序列化时,Jackson将使用该信息来了解JSON对象表示的是什么类型的类。
我有一个回应 正文 下面是我要映射的coreV2Response类
问题内容: 在杰克逊的数据绑定的文档表明,杰克逊支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:
我像这样接收JSON 当然,我实现了包含所有字段和类的类Track、Album和Playlist 顺便说一句,我不能改变JSON。所以我需要一个代码来解析它。
问题内容: 支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:
当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?
我有以下JSON文件要反序列化