Java Jackson反序列化内部集合
我对内部集合的反序列化有问题: 假设有两个类:Java Jackson反序列化内部集合,java,jackson,jackson-databind,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;
// 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);
}
}
根据javadoc@JsonSerialize(contentAs=Item.class)
的说法,这个集合对我会有帮助,但不会问题是:我缺少什么?
如果不是关于这个注释,我怀疑有一个标准的方法来处理这个问题(我不想创建自定义反序列化程序)
关于集合反序列化的大多数问题都是关于根对象本身是集合的情况,但我不是这样
杰克逊2.9.8
java 11.0.2 OpenJDK x64代码的基本形式没有问题。你想做的事会成功的。您的代码只是有问题,首先是它甚至不会编译,因为您对接受字符串的项调用了构造函数,但您没有定义这样的构造函数。你还需要与杰克逊合作的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());
}
您始终可以使用泛型:
List items=new ArrayList()代码>@MichałZiober,好的,谢谢,但我希望没有他们也能工作。我将尝试进行深度调试。如果没有类型信息,则无法正确地反序列化此JSON
。你想要实现什么?你想为许多不同的类型建立一个根模型吗?不仅仅是Item
?我的意思是在@JsonSerialize(contentAs=Item.class)
的帮助下,我发现如果我在setter方法中指定泛型集合:public void setItems(List items)
,问题就会消失。在字段中或getter上指定泛型,或将@JsonSerialize(contentAs=Item.class)
放在任何地方,都无助于hi@Steve抱歉,如果我误导了您,但我故意跳过了琐碎的代码行(访问器、构造函数)。我会添加完整的项目,如果你说这段代码适合你,那就意味着我的设置有问题,可能是jackson和Java的特定版本,这就是我要说的。如果你试过我的代码,你应该把你试过的和你得到的错误一起放在你的问题中。我想看看你犯了什么错误。这段代码应该适用于任何最新版本的Jackson,Java版本是否编译也不重要。告诉我们你用的是什么版本的东西对于那些跟随者来说,对实际编译的代码有疑问本身是有帮助的。
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