杰克逊+建造者模式?

2022-08-31 10:04:54

我希望 Jackson 使用以下构造函数反序列化类:

public Clinic(String name, Address address)

反序列化第一个参数很容易。问题是地址被定义为:

public class Address {
  private Address(Map<LocationType, String> components)
  ...

  public static class Builder {
    public Builder setCity(String value);
    public Builder setCountry(String value);
    public Address create();
  }
}

并构造如下:new Address.Builder().setCity("foo").setCountry("bar").create();

有没有办法从杰克逊那里获得键值对,以便自己构造地址?或者,有没有办法让 Jackson 使用 Builder 类本身?


答案 1

只要您使用的是Jackson 2 +,那么现在就有内置的支持

首先,您需要将此注释添加到您的类中:Address

@JsonDeserialize(builder = Address.Builder.class)

然后,您需要将此注释添加到您的类中:Builder

@JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")

如果您愿意重命名构建器的创建方法以进行构建,以及要以生成器为前缀而不是 set 的构建器 setter,则可以跳过第二个注释。

完整示例:

@JsonDeserialize(builder = Address.Builder.class)
public class Address
{
  private Address(Map<LocationType, String> components)
  ...

  @JsonPOJOBuilder(buildMethodName = "create", withPrefix = "set")
  public static class Builder
  {
    public Builder setCity(String value);
    public Builder setCountry(String value);
    public Address create();
  }
}

答案 2

Madden-Abbott@Rupert的答案是有效的。但是,如果您有一个非默认构造函数,例如,

Builder(String city, String country) {...}

然后,您应该按如下方式注释参数:

@JsonCreator
Builder(@JsonProperty("city")    String city, 
        @JsonProperty("country") String country) {...}