java - Jackson 反序列化内部集合

标签 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) 对我有帮助,但事实并非如此。 问题是:我错过了什么?

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

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

jackson 2.9.8 java 11.0.2 OpenJDK x64

最佳答案

您的代码的基本形式没有任何问题。你正在尝试做的事情将会奏效。您的代码存在问题,首先它甚至无法编译,因为您在 Item 上调用了一个采用 String 的构造函数,但您却没有定义这样的构造函数。您还需要 jackson 可以使用的 setter/getter 。

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

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

关于java - Jackson 反序列化内部集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55289000/

相关文章:

java - Sublime 2 Java 构建

java - Dropwizard 反序列化数组

java - 如何使用 Jackson 排除父类(super class)属性

java - jackson 自定义类型信息不起作用

java - 设置了时区的 SimpleDateFormat 获得正确的值但时区错误

java - Jackson Databind 中是否有任何替代品来替代已弃用的属性 SerializationFeature.WRITE_NULL_MAP_VALUES ?

java - 使用 POJO 字段名将 POJO 转换为 JsonNode

java - 使用 TCP 处理多线程

java - 搜索 JSON 对象时如何忽略大小写

java - 获取jboss的信息