业务场景
由于业务需要,在特定场景下,个别对象的属性需要全大写返回给前端。
以下实体返回给前端时,会出现前端获取的key为首字母小写
public class BaseInfoVO {
private String JSESSIONID;
}
原因分析
在spring boot 项目中,返回给前端转化为json格式常见的有两种,FastJson和Jackson两种。
FastJson在将Java对象序列化为JSON时,默认情况下会考虑Java对象的getter方法。如果Java对象中有getter方法(如getName()
),FastJson会将其视为一个属性,并且属性的名称是通过去掉getter方法名中的get
前缀,并将剩余部分的首字母转换为小写来确定的。
显然这应该是出现首字母小写的原因,解决办法也很简单。使用了@JSONField
注解来明确指定属性名。注意使用@JsonProperty不一定会生效,因为他是针对Jackson方式的。
Jackson在序列化Java对象为JSON时,默认情况下会考虑Java对象的字段名(包括私有字段,通过getter/setter方法访问)。如果字段名是全大写的,并且没有使用任何注解来改变行为,Jackson
会保持这个字段名的原样在JSON中。
Jackson并不总是通过getter方法来获取属性名。它首先会查看Java对象的字段,然后考虑getter/setter方法(特别是当字段是私有的时)。但是,Jackson提供了丰富的注解(如@JsonProperty
)来明确指定JSON属性名,无论字段名或getter/setter方法名是什么。所以通常这种方式不会出现这个问题,若出现了,则可以用对应的注解@JsonProperty
明确属性名,也可以解决问题
其他
至于实际是哪种方式导致的问题,可以简单的写一个主函数,测试一下
public static void main(String[] args) throws JsonProcessingException {
BaseInfoVO baseInfoVO = new BaseInfoVO();
baseInfoVO.setJSESSIONID("asaqwuhqfqwufhqf");
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 将User对象序列化为JSON字符串
String jacksonString = objectMapper.writeValueAsString(baseInfoVO);
System.out.println("使用Jackson序列化后的JSON字符串: " + jacksonString);
// 使用 FastJson 将对象转化为 JSON 字符串
String fastJsonString = JSON.toJSONString(baseInfoVO);
System.out.println("使用FastJson序列化后的JSON字符串: " + fastJsonString);
}
根据结果就知道是哪种json化导致,用对应的注解明确属性名就行了