一、后端传到前端的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"}

 

posted on 2023-03-13 16:04  周文豪  阅读(2195)  评论(0编辑  收藏  举报