Spring Boot Controller 返回 JSON 统一处理 key 字符串大小写
JSON Spring Boot Jackson About 3,821 words需求
需要对返回的JSON字符串中的key,全部转为首字母大写。
相关配置
返回值
@Setter
@Getter
@Data
public class Response {
    private int codeInfo;
    private Object data;
    @JsonProperty("msgHint")
    private String msgHint = "success";
}
实现全局Advice
@Slf4j
@RestControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType,
                                  MediaType selectedContentType, Class selectedConverterType,
                                  ServerHttpRequest request, ServerHttpResponse response) {
        Response res = new Response();
        res.setData(body);
        return res;
    }
}
DTO
@Setter
@Getter
@ToString
public class User {
    private String nickname;
    private String idCard;
}
Controller
@RestController
public class TestController {
    @GetMapping("/testObject")
    public User testObject() {
        User user = new User();
        user.setNickname("nickname");
        user.setIdCard("idcard");
        return user;
    }
}
key 命名策略
UpperCamelCaseStrategy
首字母大写的驼峰方式,@JsonProperty优先级更高(msgHint没有受UpperCamelCaseStrategy影响)
{
    "CodeInfo": 0,
    "Data":
    {
        "Nickname": "nickname",
        "IdCard": "idcard"
    },
    "msgHint": "success"
}
LowerCamelCaseStrategy
首字母小写的驼峰方式
{
    "codeInfo": 0,
    "data":
    {
        "nickname": "nickname",
        "idCard": "idcard"
    },
    "msgHint": "success"
}
UpperSnakeCaseStrategy
大写及下划线拼接
{
    "CODE_INFO": 0,
    "DATA":
    {
        "NICKNAME": "nickname",
        "ID_CARD": "idcard"
    },
    "msgHint": "success"
}
SnakeCaseStrategy
小写及下划线拼接
{
    "code_info": 0,
    "data":
    {
        "nickname": "nickname",
        "id_card": "idcard"
    },
    "msgHint": "success"
}
LowerCaseStrategy
小写
{
    "codeinfo": 0,
    "data":
    {
        "nickname": "nickname",
        "idcard": "idcard"
    },
    "msgHint": "success"
}
KebabCaseStrategy
中划线拼接
{
    "code-info": 0,
    "data":
    {
        "nickname": "nickname",
        "id-card": "idcard"
    },
    "msgHint": "success"
}
LowerDotCaseStrategy
小写及.拼接
{
    "code.info": 0,
    "data":
    {
        "nickname": "nickname",
        "id.card": "idcard"
    },
    "msgHint": "success"
}
YAML 配置
spring:
  jackson:
    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.UpperCamelCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.LowerCamelCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.UpperSnakeCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.SnakeCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.LowerCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.KebabCaseStrategy
#    property-naming-strategy: com.fasterxml.jackson.databind.PropertyNamingStrategies.LowerDotCaseStrategy
Java 配置
@Configuration
public class ObjectMapperConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.UpperCamelCaseStrategy.INSTANCE);
        return objectMapper;
    }
}
单独配置
使用@JsonNaming注解指定命名策略。
@Setter
@Getter
@Data
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public class Response {
    private int codeInfo;
    private Object data;
    @JsonProperty("msgHint")
    private String msgHint = "success";
}
注意
PropertyNamingStrategy不适用于Map集合。
                Views: 1,712 · Posted: 2024-09-18
            
            ————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
 
        Loading...