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 找不到类的序列化程序
spring.jackson.serialization.fail-on-empty-beans
Jackson ObjectMapper 无法反序列化 POJO,抛出异常:没有找到适合类型 [...] 的构造函数:无法从 JSON 对象实例化