日常问题记录:fastjson转化dto大小写问题
1、场景:传给第三方接口的参数
2、问题分析:获取param1的时候需要通过fastjson转化dto,默认会转化成小写的,需要格式是大写的
JSON.toJSONString(AccountDTO);
预期结果--------------------->
{"Users":[{"Name":"1643157939815211008","PassWord":"9HBTbQn367UBW+dvSxyW1w=="},{"Name":"1643157939815211009","PassWord":"8g4uqHRpKAFptt4hM/dSbg=="}]}
实际结果--------------------->
{"users":[{"name":"1643157939815211008","passWord":"9HBTbQn367UBW+dvSxyW1w=="},{"name":"1643157939815211009","passWord":"8g4uqHRpKAFptt4hM/dSbg=="}]
解决思路1
dto字段为小写,添加@JsonProperty("Name")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AccountParamDTO implements Serializable {
private static final long serialVersionUID = 1528608077503055270L;
/**
* Name
*/
@JsonProperty("Name")
private String name;
/**
* PassWord
*/
@JsonProperty("PassWord")
private String passWord;
这个接口可以将dto作为第三方接口入参的时候自动转换成大写的,但是fastjson转化还是小写的
解决思路2
添加@JSONField(name="Name")
单独使用可以解决fastjson转化成大写的问题,测试中发现和@JsonProperty("Name")一起使用,作为dubbo接口会报没有序列化的问题(实际已添加序列化)
还有一种山寨的方法就是定义两个dto,这个冲突的问题就解决了
解决思路3
直接将dto定义为大写的传输
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class AccountParamDTO implements Serializable {
private static final long serialVersionUID = 1528608077503055270L;
/**
* Name
*/
private String Name;
/**
* PassWord
*/
private String PassWord;
在需要转成json的类里添加下边的静态代码
static {
TypeUtils.compatibleWithJavaBean = true;
TypeUtils.compatibleWithFieldName = true;
}
@Override
public void apply(AccountDTO accountDTO) {
.....
JSON.toJSONString(accountDTO);
}
转化结果正常,注意这种方法静态检查会有问题,java检测命名规范驼峰格式
最终采用的是方法2定义了两个dto
共有 0 条评论