java - 杰克逊反序列化内部集合
问题描述
我对内部集合的反序列化有疑问:想象有两个类:
// 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
解决方案
您的代码的基本形式没有任何问题。你正在尝试做的事情会奏效。您的代码只是有问题,首先是它甚至无法编译,因为您在 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
推荐阅读
- c# - 如何在 Unity 中有活动和加载的场景但不渲染它?
- python - 尝试将具有不同日期时间戳的数据组合到最接近的日期
- sql-server - 计算有超过 10 笔交易的客户数量,不包括退货?
- thymeleaf - Thymeleaf - 将集合转换为有序列表
- c - 使用 FatFs 访问 SDHC 卡上的现有分区
- vba - How to execute an external .sql file pass-through query in ms-access
- java - 如何在地图输出中写入两个键和一个值?
- python - 基于规则的词性解析困境
- java - 如何使用 Java 程序在记事本中关闭文本文件
- python - 从python中的列表中减法