Jackson是否可以使用Builder模式以及默认的setter和getter方法反序列化JSON?
我的对象是使用生成器创建的,该生成器仅包含必填(最终)字段,但是我有一些带有一些值的非最终字段,也需要使用设置器反序列化。
以下是引发异常以尝试使用以下方法反序列化的示例:
new ObjectMapper().readValue(json, Foo.class);
json-使用默认的Jackson序列化器序列化的json表示形式,例如:
objectMapper.writeValueAsString(foo);
班
@Getter
@Setter
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonDeserialize(builder = Foo.Builder.class)
public class Foo {
private final String key;
private final Long user;
private final String action;
private final String material;
private final String currency;
private Foo(String key, Long user, String action, String material, String currency) {
this.key = key;
this.user = user;
this.action = action;
this.material = material;
this.currency = currency;
}
public static class Builder {
private String key;
private Long user;
private String action;
private String material;
private String currency;
@JsonProperty("key")
public Foo.Builder withKey(String key) {
this.key = key;
return this;
}
@JsonProperty("user")
public Foo.Builder withUser(Long user) {
this.user = user;
return this;
}
@JsonProperty("action")
public Foo.Builder withAction(String action) {
this.action = action;
return this;
}
/// other 'with' setters....
}
@JsonProperty("state")
private int state;
@JsonProperty("stat")
private String stat;
@JsonProperty("step")
private String step;
}
它引发的异常:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段“状态”(类com.Foo $ Builder),未标记为 可忽略的(5个已知属性:“键”,“用户”,“动作”,“材料”, “货币”,])
如果不可能,哪种解决方法最便宜?
答案 0 :(得分:2)
可疑的两件事:
Foo
类中使用构建器。在这种情况下,您应该更正规格
(SessionData.Builder.class
在这种情况下不正确。)在两种情况下,您都应确保获取Foo
实例的最终方法称为build()
,否则应使用@JsonPOJOBuilder(buildMethodName = "nameOfMethod", withPrefix = "set")
注释构建器。