杰克逊(Jackson):与Builder一起反序列化标准设置器/获取器?

时间:2018-11-21 09:10:59

标签: java json jackson builder

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个已知属性:“键”,“用户”,“动作”,“材料”,   “货币”,])

如果不可能,哪种解决方法最便宜?

1 个答案:

答案 0 :(得分:2)

可疑的两件事:

  • 您愿意在Foo类中使用构建器。在这种情况下,您应该更正规格 (SessionData.Builder.class在这种情况下不正确。)
  • 您确实在尝试使用外部构建器。在这种情况下,您应该删除或至少将内部生成器标记为可忽略,这似乎就是您获得竞争的原因。

在两种情况下,您都应确保获取Foo实例的最终方法称为build(),否则应使用@JsonPOJOBuilder(buildMethodName = "nameOfMethod", withPrefix = "set")注释构建器。