如何使用Java中的Jackson来序列化setter less属性

时间:2016-03-23 15:39:57

标签: jackson

我正在使用Spring启动Web服务,@ requestbody.While将JSON转换为Java Object抛出错误消息为“问题反序列化'setterless'属性”

我的POJO是这样的。

filter

2 个答案:

答案 0 :(得分:2)

班级test不符合Java bean。字段_AdminRequestSet的名称与getter getAdminRequestSet不对应。 Jackson支持没有setter的序列化,但必须可以从json中的属性名映射到目标类中的字段。

例如我们有这个json:

{"adminRequestSet": [{"id":1},{"id":2}]}

杰克逊能够在班级getAdminRequestSet中找到getter test,它对应于json中的属性adminRequestSet。但是课程setAdminRequestSet中没有设置adminRequestSet且没有字段test

现在你有不同的选择。这里列出了常见的解决方案:

选项1: 将字段_AdminRequestSet重命名为adminRequestSet(以便类测试符合java bean)

选项2: 使用annotation指定字段的属性名称

@JsonProperty("adminRequestSet")
private List<AdminRequest> _AdminRequestSet;

选项3: 如果您无法更改课程test,则可以使用Jackson MixIns

abstract class testMixIn {
    @JsonProperty("adminRequestSet") 
    private List<AdminRequest> _AdminRequestSet;
}

//register testMixin for class test
objMapper.addMixIn(test.class, testMixIn.class);

答案 1 :(得分:0)

选项4:。删除不必要的吸气剂/设置剂。

考虑这种情况:

@JsonProperty("data")
private List<AdminRequest> _AdminRequestSet;

public List<AdminRequest> getAdminRequestSet()
{
  return _AdminRequestSet;
}

问题在于,Jackson尝试匹配成员adminRequestSet上的getter / setter模式,但找不到数据成员。因此是例外。

您需要考虑两件事:

  1. 您是否真的需要getAdminRequestSet()方法?如果是这样,请使用@JsonIgnore对其进行注释。让@JsonProperty(“ data”)将列表生成为“ data”。

  2. 搜索用法以确定是否需要getXXX()方法。如果不需要,请将其删除。您甚至不必使用@JsonIgnore进行注释。

相关问题