【问题标题】:Jackson JSON how to deserialize date from object-arrayJackson JSON如何从对象数组中反序列化日期
【发布时间】: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


【解决方案1】:

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

关于反序列化:您的属性是通用的 - Object[]。从您当前的 JSON 中,无法确定应该以什么 Java 类型对其进行实例化。这就是为什么 JSON 应该包含关于它的日期元素的附加信息,有点 ... {@type:“日期”,“日期”:1390859948022} ... 或像这样: ... {“日期”:{@type:“日期”,“值”:1390859948022} ...

您是如何做到的 - 请参阅“dnault”的上一个答案并链接到那里的 Jackson。

【讨论】:

    【解决方案2】:

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

    但是您可以强制使用类型信息来实现这一点;要使用的注释是@JsonTypeInfo,您可以将其添加到字段旁边,如下所示:

    @JsonTypeInfo(...)
    private Object[] objects;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 注解混合只有在你不能改变代码的情况下才有用。如果可以修改代码,多态方法更好。
      • 感谢您的回答。当我使用 JsonTypeInfo-Annotation 时它工作正常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2011-06-28
      • 2011-09-15
      • 2011-06-14
      • 2014-02-12
      相关资源
      最近更新 更多