gpt4 book ai didi

java - Jackson JSON 如何反序列化对象数组中的日期

转载 作者:行者123 更新时间:2023-11-29 05:30:09 30 4
gpt4 key购买 nike

我会序列化/反序列化一个包含混合对象的对象数组。为此,我创建了一个 MyList 类,并用字符串、整数和日期对象填充项目数组。jackson 的序列化效果很好。 json 字符串如下所示:

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

但是在反序列化时,json 字符串日期被解析为整数。所以我创建了一个自己的类 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
}

我的日期.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);

这适用于我和我的具体问题。

最佳答案

继续阅读 Polymorphic Deserialization .目前,您要告诉 Jackson 的只是您希望它反序列化一个对象数组。为了让它工作,您需要注释您的 MyDate 类(或使用 Annotation Mixins 来注释内置的 Date 类),以便 Jackson 在序列化您的日期时输出一些额外的类型信息。在反序列化时,Jackson 将使用该信息来了解 JSON 对象代表的类类型。

关于java - Jackson JSON 如何反序列化对象数组中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21392994/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com