Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson反序列化内部集合_Java_Jackson_Jackson Databind - Fatal编程技术网

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