java get方法不序列化_Jackson序列化没有get, Set方法的POJO

异常

重现代码

@Test

public void testObjectMapper() throws JsonProcessingException {

ObjectMapper objectMapper = new ObjectMapper();

Man man = new Man();

System.out.println(objectMapper.writeValueAsString(man));

}

public static class Man {

private int age;

private String name;

}

当 Jackson 遇到没有 getter, setter 方法的 POJO 时, 会抛出这个异常:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class JUnitTest$Man and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

通过异常的说明, 可以知道原因是: 对于类 Man 没有找到序列化器, 并且没有发现有相应的属性来创建 BeanSerializer 序列化器.

解决

异常中, 也给出了一个解决方案: 禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS:

objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

通过源码, 可看到, 它默认是 true 的:

SerializationFeature.FAIL_ON_EMPTY_BEANS(true)

如果这样子配置了的话, 则像上面这种 Man 的 POJO, 它序列化出来的结果是 {}

开启反射时访问所有访问修饰符的字段:

objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

像这样子的话, 就可以直接访问那些 private 字段, 而不需要 getter, setter 了. (不过, 没测试过这种情况下的 json 序列化性能, 如果对性能比较敏感的话, 请自行进行基准测试)

异常

com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: )

有时, 我们在 pojo 里添加了一些自定义的方法, 但实际上它们并不是属于普通 bean 的 get/set 的, 这样子的话, 它就会报类似上面的异常了.

这时, 可以在相应的方法上, 加上@JsonIgnore 注解来忽略序列化它.免得让 Jackson 误认为它是 getter/setter 的方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值