杰克逊反序列化内部集合

时间:2019-03-21 20:46:53

标签: java jackson jackson-databind

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

// 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')

根据该集合上的javadoc @JsonSerialize(contentAs = Item.class)会对我有所帮助,但没有帮助。 问题是:我想念什么?

如果与该注释无关,我怀疑有解决此问题的标准方法(我不想创建自定义解串器)。

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

杰克逊2.9.8 Java 11.0.2 OpenJDK x64

1 个答案:

答案 0 :(得分:3)

代码的基本形式没有错。您尝试执行的操作将起作用。您只是在代码方面遇到问题,首先,由于您在使用String的Item上调用了一个构造函数,因此甚至无法编译该事实,但尚未定义此类构造函数。您还需要与杰克逊一起使用的吸气剂。

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

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