Jackson:没有找到类的序列化器~~~~~也没有找到创建 BeanSerializer 的属性

Posted

技术标签:

【中文标题】Jackson:没有找到类的序列化器~~~~~也没有找到创建 BeanSerializer 的属性【英文标题】:Jackson: No serializer found for class ~~~~~ and no properties discovered to create BeanSerializer 【发布时间】:2020-04-22 00:44:58 【问题描述】:

我有一个类的 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>(); 

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

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

并收到此错误消息:

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

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

我做错了什么?

【问题讨论】:

我有一个名为 people 的数组列表。当我执行 mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS) 时,它给了我 [、、、、、、、、、、]。没有它,它只会创建一个损坏的 json 文件:“ [”。 能把完整的代码放上来吗 我的代码非常混乱,因为我是 Java 新手。我正在抓取***并收集政客的数据。 您发布的示例没有公共成员。序列化类很可能在那些 to 序列化的对象中根本看不到任何东西。 Java 的默认访问修饰符(如果您没有指定其他内容,就像您在此处所做的那样)只允许在同一个包内或从类本身进行访问。最佳做法是添加(公共)getter 和 setter。 【参考方案1】:

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.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

【讨论】:

【参考方案2】:

摘自here:

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

您的 Person 具有所有字段 package protected 并且没有 getter,因此会出现错误消息。禁用消息自然不能解决问题,因为从 Jackson 的角度来看,课程仍然是 empty。这就是您看到空对象的原因,最好让错误保持打开状态。

您需要将所有字段设为public,例如:

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...

【讨论】:

很好的答案。添加一个小后记:对于具有大量字段的大型类,Eclipse 具有自动生成 getter 和 setter 功能,可在 Source -> Generate Getters and Setter 下找到 @Lycanthropeus 是的,这是一种方式。我更喜欢使用 Lombok @Getter @Setter 注释来获得更简洁的代码。 谢谢。我的领域没有任何公共访问权限。错过了添加 getter、setter 的 lombok @Data

以上是关于Jackson:没有找到类的序列化器~~~~~也没有找到创建 BeanSerializer 的属性的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Jackson ResponseEntity 找不到类的序列化程序

如何根据json中的属性编写jackson反序列化器

spring.jackson.serialization.fail-on-empty-beans

杰克逊错误:没有适合简单类的构造函数

Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化

json之jackson的注解@Jsonformat