Jackson:没有找到类~~~~~的序列化程序,也没有发现创建 BeanSerializer 的属性

702*_*279 5 java serialization json jackson

我有一个类的 ArrayList,如下所示:

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>(); 
}
Run Code Online (Sandbox Code Playgroud)

我想将此列表编写为 Json 并尝试使用以下代码:

Writer out = new PrintWriter("./test.json");
mapper.writerWithDefaultPrettyPrinter().writeValueas(out, persons);
Run Code Online (Sandbox Code Playgroud)

并收到此错误消息:

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

我尝试添加,mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)但由于某些未知原因,它使所有人员对象都为空。

我怎么了?

pir*_*rho 11

摘自这里

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

您的Person所有字段都受到保护,并且没有 getter,因此出现错误消息。禁用消息自然不会解决问题,因为类仍然是empty从杰克逊的角度来看的。这就是为什么您看到空对象并且最好保留错误的原因。

您需要创建所有字段public,例如:

public class Person {
    public String name;
    // rest of the stuff...
}
Run Code Online (Sandbox Code Playgroud)

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

public class Person {
    private String name;

    public String getName() {
        return this.name;
    }
    // rest of the stuff...
}
Run Code Online (Sandbox Code Playgroud)

  • @Lycanthropeus 是的,这是一种方式。我更喜欢使用 [Lombok](https://projectlombok.org/) `@Getter` `@Setter` 注释来获得更清晰的代码。 (2认同)