当前位置: 首页 > 知识库问答 >
问题:

Jackson:找不到类~~~~的序列化程序,也找不到创建BeanSerializer的属性

封锐藻
2023-03-14

我有一个类的数组列表,如下所示:

public class Person {
    String name;
    String age 
    List<String> education = new ArrayList<String> ();
    List<String> family = new ArrayList<String> (); 
    List<String> previousjobs = new ArrayList<String>(); 
}

我想把这个列表写成Json,并尝试了以下代码:

Writer out = new PrintWriter("./test.json");
mapper.writerWithDefaultPrettyPrinter().writeValueas(out, persons);

并收到以下错误信息:

找不到类~~~~~的序列化程序,也找不到创建BeanSerializer的属性(为了避免异常,请禁用SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过引用链:java.util.ArrayList[0])`

我尝试添加映射器。禁用(SerializationFeature.FAIL_ON_EMPTY_BEANS)但由于未知原因,它使所有Person对象都为空。

我做错了什么?

共有2个答案

阎淮晨
2023-03-14

Person类中的所有字段都使用默认的访问说明符。要么公开字段,要么添加公共getter方法。下课应该有用。

public class Person {

    private String name;
    private String age ;
    private List<String> education = new ArrayList<String> ();
    private List<String> family = new ArrayList<String> (); 
    private List<String> previousjobs = new ArrayList<String>(); 

    public String getName() {
        return name;
    }

    public String getAge() {
        return age;
    }

    public List<String> getEducation() {
        return education;
    }

    public List<String> getFamily() {
        return family;
    }

    public List<String> getPreviousjobs() {
        return previousjobs;
    }

}

如果POJO在我们的控制之下,我们可以如上所述修改POJO。如果POJO不受控制,我们可以将可见性设置为如下任何objectMapper。设置可见性(PropertyAccessor.FIELD,Visibility.ANY);

严琨
2023-03-14

从这里摘录:

默认情况下,Jackson 2将仅使用公共字段或具有公共getter方法的字段-序列化所有字段私有或包私有的实体将失败:

您的Person的所有字段都受包保护,并且没有getter,因此会显示错误消息。禁用消息自然无法解决问题,因为在Jackson看来,类仍然是空的。这就是为什么你会看到空的对象,最好不要出错。

您需要将所有字段公开,例如:

public class Person {
    public String name;
    // rest of the stuff...
}

或者为每个字段创建一个公共getter(最好也将字段设置为私有),比如:

public class Person {
    private String name;

    public String getName() {
        return this.name;
    }
    // rest of the stuff...
}
 类似资料: