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

标签 java arrays json jackson deserialization

我会序列化/反序列化一个包含混合对象的对象数组。为此,我创建了一个 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/

相关文章:

c - 如何在 C 中退出后返回变量

json - hadoop - 验证加载到 hive 仓库中的 json 数据

java项目监听器

java - 在java中为系统外观添加一些东西

c# - 替换存储在表示 Word/Excel 文档的字节数组中的字符串

c++ - 将 C++/C 中的二维数组拆分为子数组

python - 如何在 Python 中处理 JSON 和 Windows 路径?

android - 将 onPostExecute 结果传递给新 Activity

java - 验证骰子组合

java - 为什么从 Fish 运行时 Maven 使用错误的 JDK 版本?