在spring Boot 中反序列化JSON,其中一个字段是两个字段的组合

pkmbmrz7  于 2023-02-03  发布在  Spring
关注(0)|答案(3)|浏览(188)

我有一个具有以下签名的控制器:

public HttpEntity<RepresentationModel> confirmRegistration(@Valid @RequestBody RegistrationRequest request{}

RegistrationRequest JSON如下所示

{
//other fields
"countryCode":"44",
"mobileNumber": "07545878096"
}

我正在尝试为此JSON编写自定义反序列化程序
我的mobileNumber类如下所示:

@Getter
@Setter
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class MobileNumber {
  @JsonProperty("mobilePhoneNumber")
  @JsonAlias("mobileNumber")
  String number;
  @JsonProperty(value = "countryCode", defaultValue = "44")
  String countryCode;
}

和请求对象,如下所示:

public class RegistrationRequest {
//other fields
  @JsonDeserialize(using = MobileNumberDeserializer.class)
  @MobileNumberValidator
  private final MobileNumber mobilePhoneNumber;

}

其中,MobileNumberDeserializer类似于:

public class ContactNumberDeserializer extends StdDeserializer<MobileNumber> {

  private static final long serialVersionUID = 1L;

  protected ContactNumberDeserializer() {
    super(MobileNumber.class);
  }

  @Override
  public MobileNumber deserialize(JsonParser jsonParser, DeserializationContext ctxt)
      throws IOException {

    JsonNode node = jsonParser.getCodec().readTree(jsonParser);
    String mobileNumber = "";
    if (node.has("mobilePhoneNumber")) {
      mobileNumber = node.get("mobilePhoneNumber").asText();
    } else if (node.has("phoneNumber")) {
      mobileNumber = node.get("phoneNumber").asText();
    } else if (node.has("mobileNumber")) {
      mobileNumber = node.get("mobileNumber").asText();
    }
    String countryCode = node.get("countryCode").asText();

    return new MobileNumber(mobileNumber, countryCode);

  }

当控制器jsonParser.getCodec().readTree(jsonParser);调用ContactNumberDeserializer时,它只是mobilePhoneNumber节点,无法访问countryCode

yjghlzjz

yjghlzjz1#

快速检查联系人号码和手机号码是否相同类。
理想情况下应该是
公共类ContactNumberDeserializer扩展了标准反序列化程序

piok6c0g

piok6c0g2#

在您的手机号码类中:

@Getter
@Setter
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class MobileNumber {
  @JsonProperty("mobilePhoneNumber")
  @JsonAlias("mobileNumber")
  String number;
  @JsonProperty("countryCode")
  String countryCode = "44";
}

更新jsonProperty注解,如上面的国家代码。希望它有帮助!

qcbq4gxm

qcbq4gxm3#

你不需要写ContactNumberDeserializer,如果你写了你的类MobileNumber,它会简单地工作。

相关问题