java 如何使用Springboot更改Json值以适应Enum大小写敏感性?

qoefvg9y  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(97)

我在构建控制器时遇到了一个问题。我正在向第三方发送GET请求并接收回数据,然后将其Map到DTO。其中一个数据是Address和AddressType。
我使用以下命令调用第三方的GET请求:

final ResponseEntity<AddressResponseDTO> response =
                restTemplate.exchange(builder.build().toUri(),
                        HttpMethod.GET,
                        request,
                        AddressResponseDTO.class);

这是我的Json响应:

"addressType": "Mailing",
"line1": "123 Ave",
"line2": "",
"city": "New York",
"state": "NY",

最初,我使用

@JsonProperty("addressType")
    private AddressType addressType;

    @JsonProperty("line1")
    private String line1;

    @JsonProperty("line2")
    private String line2;

    @JsonProperty("city")
    private String city;

    @JsonProperty("state")
    private String state;

地址类型是枚举。

public enum AddressType {
        BUSINESS,
        MAILING,
        DELIVERY

}

问题是JSON响应返回Business而不是BUSINESS,这会引发错误。
我试着把它添加到DTO中:

@JsonProperty("addressType")
    private String addressEnum;

    private AddressType addressType = AddressType.valueOf(addressEnum.toUpperCase());

但它只是忽略了这一点。有没有一个简单的方法来Map业务到业务?我觉得这应该是一个简单的Springboot注解,但我找不到任何东西。

vvppvyoh

vvppvyoh1#

一个可能的解决方案是使用Jackson创建一个自定义的反序列化器。这使您可以编写自定义代码来执行反序列化,从而完全控制数据的解释方式。
首先,定义一个新的反序列化器类

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class CaseInsensitiveEnumDeserializer extends JsonDeserializer<AddressType> {

    @Override
    public AddressType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
        throws IOException {
        return AddressType.valueOf(jsonParser.getText().toUpperCase());
    }
}

然后,在DTO中,使用@JsonDeserialize注解指定这个新的反序列化器类
导入com.fasterxml.Jackson.databind.annotation.JsonDeserialize;

public class AddressResponseDTO {
    @JsonDeserialize(using = CaseInsensitiveEnumDeserializer.class)
    private AddressType addressType;
    // your fields and methods
}

这段代码现在将正确地反序列化JSON响应中AddressType枚举值的任何大小写变体。

相关问题