[英]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.