日常问题记录:fastjson转化dto大小写问题

1、场景:传给第三方接口的参数 ,其中dto首字母大写,string为dto的json格式
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

版权声明:
作者:admin
链接:https://www.techfm.club/p/49035.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>