繁体   English   中英

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

[英]Desrialzing JSON in spring boot, where a field is the combination of two fields

我有一个带有以下签名的 controller:

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

RegistrationRequest Json 看起来像这样

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

我正在尝试为此 json 编写自定义解串器

我的手机号码 class 如下所示:

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

和请求 object 像这样:

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);

  }

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

快速检查 ContactNumber 和 MobileNumber 是否相同。

理想情况下应该是

公共 class ContactNumberDeserializer 扩展 StdDeserializer<MobileNumber {

在您的手机号码 class 中:

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

像上面那样为 countryCode 更新 JsonProperty 注释。 希望能帮助到你!

您不需要编写ContactNumberDeserializer 如果您编写MobileNumber手机号码,它就可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM