当前位置: 首页 > 知识库问答 >
问题:

Jackson JSON如何从对象数组反序列化日期

冯翔
2023-03-14

我将用混合对象序列化/反序列化对象数组。因此,我创建了一个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);

这对我和我的具体问题都有效。

共有3个答案

邹弘
2023-03-14

关于日期序列化-请参阅http://wiki.fasterxml.com/JacksonFAQDateHandling

关于反序列化:您的属性是泛型-对象[]。根据您当前的JSON,不可能确定应该以何种Java类型实例化它。这就是为什么JSON应该包含关于其日期元素的其他信息,有点。。。{@type:“date”,“date”:1390859948022}。。。或者像这样:。。。{“date”:{@type:“date”,“value”:1390859948022}。。。

如何做到这一点-请参阅“dnault”之前的答案,并在那里链接到Jackson。

于嘉誉
2023-03-14

您的问题是Jackson无法知道JSON字符串或数字应该映射到java.util.Date,如果您所说的只是映射到java.lang.对象。

但是您可以强制使用类型信息来实现这一点;要使用的注释是@JsonTypeInfo,您可以像这样在字段旁边添加它:

@JsonTypeInfo(...)
private Object[] objects;
养学
2023-03-14

阅读多态反序列化。目前,你只想告诉Jackson,你希望它对一系列对象进行反序列化。为了使其工作,您需要注释MyDate类(或使用注释混合来注释内置的Date类),这样Jackson在序列化日期时会输出一些额外的类型信息。在反序列化时,Jackson将使用该信息来了解JSON对象表示的是什么类型的类。

 类似资料:
  • 我有一个回应 正文 下面是我要映射的coreV2Response类

  • 问题内容: 在杰克逊的数据绑定的文档表明,杰克逊支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 我像这样接收JSON 当然,我实现了包含所有字段和类的类Track、Album和Playlist 顺便说一句,我不能改变JSON。所以我需要一个代码来解析它。

  • 问题内容: 支持deserialising“所有支持类型的数组”,但我不能找出确切的语法这一点。 对于单个对象,我可以这样做: 现在,对于数组,我想这样做: 有人知道是否有不可思议的命令吗?如果没有,那么解决方案是什么? 问题答案: 首先创建一个映射器: 作为数组: 作为列表: 指定列表类型的另一种方法:

  • 当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?

  • 我有以下JSON文件要反序列化