一、后端传到前端的JSON数据大写变小写
后台属性名为qStandard,如下所示:‘
到前端后,变成qstandard,如下所示:
原因分析:Jackson是springmvc默认用来实现json序列化和反序列化,默认的策略时get和set方法,而Lombok生成的get/set方法与手写生成的get/set方法不一样。
手写生成的get/set方法:
public Double getqStandard() { return qStandard; } public void setqStandard(Double qStandard) { this.qStandard = qStandard; }
lombok生产的get/set方法:
public Double getQStandard() { return this.qStandard; } public void setQStandard(final Double qStandard) { this.qStandard = qStandard; }
解决办法:
(1)、我们自己手动编写get/set方法
当我们注释掉@Data注解,并手动生成getter/setter方法,发现返回前端时仍然为qStandard。
(2)、使用别名,用注解@JsonProperty("qStandard")
@JsonProperty("qStandard") @Column(name = "Q_STANDARD") private Double qStandard;
@JsonProperty是jackson的注解:该注解用于指定 Java对象的属性与 JSON的属性之间的映射关系。
(3)、在使用lombok的时候,不使用一个小写字母接一个大写字母的属性命名
经过测试,当属性命名为qSTandard、qSTAndard、QSTAndard时,前端仍然为qstandard。即当jackson去掉get/set,会把首字母改为小写,如果后面紧跟着仍然有大写字母时,会继续将大写字母改为小写字母。
在项目中应当命名规范,避免不符合驼峰命名法的变量名或者字段名,比如USERGender、aId,这种最后转换都会变为小写。
二、使用@JsonProperty注解来解决属性名不一样的问题
在项目开发过程中,如果第三方提供的接口文档的属性的名称与我们的属性名称不一样,我们可以用@JsonProperty 注解来实现json字符串与我们java对象之间的转换
@JsonProperty添加在属性上,并使用new ObjectMapper().writeValueAsString(object)转换为别名的JSON字符串,使用new ObjectMapper().readValue(json字符串数据,Class)将json字符串转为java对象。
@JsonProperty("PERSON_NAME") private String personName; // 规范的可以不用加 private String mobile; @JsonProperty("Sex") private String sex; @JsonProperty("HOBBY") private String hobby;
如果时我们传参给第三方的时候,可以通过writeValueAsString方法将java对象转为json字符串:
User user = new User("张三","13222222222","0","xxx") ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(user) System.out.println(json); //这里打印出来就是文档所要的格式了
如果是我们接收参数,我们通过readValue方法进行转换成java对象。
参数如下:
{ "PERSON_NAME":"张三", "mobile":"13222222222", "Sex":"1", "HOBBY":"xxx", }
接收转换实体:
User user = new ObjectMapper().readValue(jsonResult,User.class);
案例说明:
引入依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> <scope>compile</scope> </dependency>
创建实体类
import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; @Data public class DictVO { /** * 字典编号 */ @JsonProperty(value = "dict_type_id") private String dictTypeId; /** * 字典名称 */ @JsonProperty(value = "dict_type_name") private String dictTypeName; /** * 字典代码 */ @JsonProperty(value = "dict_type_code") private String dictTypeCode; }
1、json字符串转为java对象readValue
实体类
@Data public class DictVO1 { /** * 字典编号 */ @JsonProperty(value = "dict_type_id") private String dictTypeId; /** * 字典名称 */ @JsonProperty(value = "dict_type_name") private String dictTypeName; /** * 字典代码 */ @JsonProperty(value = "dict_type_code") private String dictTypeCode; }
测试类
public class demo { public static void main(String[] args) throws JsonProcessingException { JSONObject jsonObject = new JSONObject(); jsonObject.put("dict_type_id","1745483801540300811"); jsonObject.put("dict_type_name","激活"); jsonObject.put("dict_type_code","1"); String s1 = JSON.toJSONString(jsonObject); System.out.println(s1); DictVO1 dictVO1 = new ObjectMapper().readValue(s1,DictVO1.class); // DictVO1 dictVO1 = JSON.parseObject(s1, DictVO1.class); System.out.println(dictVO1); } }
结果:
{"dict_type_name":"激活","dict_type_id":"1745483801540300811","dict_type_code":"1"} DictVO1(dictTypeId=1745483801540300811, dictTypeName=激活, dictTypeCode=1)
如果不加@JsonProperty注解,报错如下:
2、java对象转json字符串writeValueAsString
加@JsonProperty注解之前
实体类:
@Data public class DictVO1 { /** * 字典编号 */private String dictTypeId; /** * 字典名称 */private String dictTypeName; /** * 字典代码 */private String dictTypeCode; }
测试类
public class demo { public static void main(String[] args) throws JsonProcessingException { DictVO1 dictVO = new DictVO1(); dictVO.setDictTypeId("1745483801540300811"); dictVO.setDictTypeCode("1"); dictVO.setDictTypeName("激活"); ObjectMapper mapper = new ObjectMapper(); String s = mapper.writeValueAsString(dictVO); System.out.println(s); } }
结果:
{"dictTypeId":"1745483801540300811","dictTypeName":"激活","dictTypeCode":"1"}
加@JsonProperty注解之后
实体类
@Data public class DictVO1 { /** * 字典编号 */ @JsonProperty(value = "dict_type_id") private String dictTypeId; /** * 字典名称 */ @JsonProperty(value = "dict_type_name") private String dictTypeName; /** * 字典代码 */ @JsonProperty(value = "dict_type_code") private String dictTypeCode; }
测试类
public class demo { public static void main(String[] args) throws JsonProcessingException { DictVO1 dictVO = new DictVO1(); dictVO.setDictTypeId("1745483801540300811"); dictVO.setDictTypeCode("1"); dictVO.setDictTypeName("激活"); ObjectMapper mapper = new ObjectMapper(); String s = mapper.writeValueAsString(dictVO); System.out.println(s); } }
结果:
{"dict_type_id":"1745483801540300811","dict_type_name":"激活","dict_type_code":"1"}