首页 > 解决方案 > 杰克逊反序列化内部集合

问题描述

我对内部集合的反序列化有疑问:想象有两个类:

// RootClass.java
package somepackage;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;

import java.util.ArrayList;
import java.util.List;

class RootClass {
    public List getItems() {
        return items;
    }

    public void setItems(List items) {
        this.items = items;
    }

    @JsonSerialize(contentAs = Item.class)
    List<Item> items = new ArrayList<>();
}

//Item.java
package somepackage;

class Item {
    String name;

    public Item() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Item(String cat) {
        name = cat;
    }
}

// main class
package somepackage;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;

public class SampleCase {
    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        RootClass root = new RootClass();
        root.items.add(new Item("cat"));
        String json = mapper.writeValueAsString(root);
        RootClass root2 = mapper.readValue(json, RootClass.class);
        Item item = (Item) root2.items.get(0);
    }
}

我得到一个例外:

Exception in thread "main" java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class somepackage.Item (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; somepackage.Item is in unnamed module of loader 'app')

根据@JsonSerialize(contentAs = Item.class)集合上的 javadoc 会帮助我,但不会。问题是:我错过了什么?

如果不是关于这个注释,我怀疑有一个标准的方法来处理这个问题(我不想创建自定义反序列化器)。

大多数关于集合反序列化的问题都是关于根对象是集合本身的情况,但对我来说并非如此。

杰克逊 2.9.8 java 11.0.2 OpenJDK x64

标签: javajacksonjackson-databind

解决方案


您的代码的基本形式没有任何问题。你正在尝试做的事情会奏效。您的代码只是有问题,首先是它甚至无法编译,因为您在 Item 上调用了一个接受 String 的构造函数,但是您没有定义这样的构造函数。您还需要让 Jackson 使用的吸气剂。

这是您的代码的一个有效版本:

class RootClass {
    List<Item> items = new ArrayList<>();
    public List<Item> getItems() {
        return items;
    }
}

class Item {
    String name;
    Item() {}
    Item(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

public static void main(String[] argsx) throws IOException{

    ObjectMapper mapper = new ObjectMapper();
    RootClass root = new RootClass();
    root.items.add(new Item("cat"));
    RootClass root2 = null;
    String json = mapper.writeValueAsString(root);
    root2 = mapper.readValue(json, RootClass.class);
    Item item = root2.items.get(0);
    System.out.println(item.getName());
}

输出:

cat

推荐阅读