java系列之-GSON解决字段命名不规范,字段过滤实体转JSON失败的问题

依赖包:


    <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.5</version>
    </dependency>

下面没有生成对应的get set方法用了 lombok插件

有时与第三方平台做对接的时候,会发现有的平台由于历史遗留问题,字段命名什么的没有按照开发规范来(例如:阿里开发规范),个人是比较尊重规范的人,下面是别人接口的命名,感受一下:

{ 
    "serial_number": "", 
    "timestamp": "", 
    "ret_type": "", 
    "service_name": "", 
    "platform_type": "", 
    "token": "", 
    "request_data": 
    { 
        "brandid": "" 
    } 
} 

这种开这还可以,勉强可以接受,更有IDCard、certAddr、facepic要么首字母大写的,要么没有按照驼峰式的、要么命名不准确的,这种字段很多,个人感觉很不友好

GSON里面有个注解可以很好地解决字段转JSON重命名注解@SerializedName

public class GsonJsonignoreVO implements Serializable
{
    private static final long serialVersionUID = 4885951893801257633L;

    @SerializedName("userName")
    private String name;

    private String gender;

    private Integer age;

    @SerializedName("IDCard")
    private String idCard;
}

运行结果如图:

 

由于使用的swagger-ui访问接口,因为有些字段从父类继承来的,不需要展示在子类接口,边使用了

com.fasterxml.jackson.annotation.JsonIgnore; 

/** 忽略字段 */ 
@JsonIgnore private String ownercertaddr;

但是这样用到GSON OBJECT转JSON时会抛异常。

Exception in thread "main" java.lang.IllegalArgumentException: class com.wc.gson.model.GsonJsonignoreVO declares multiple JSON fields named token
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
	at com.google.gson.Gson.getAdapter(Gson.java:458)
	at com.google.gson.Gson.toJson(Gson.java:696)
	at com.google.gson.Gson.toJson(Gson.java:683)
	at com.google.gson.Gson.toJson(Gson.java:638)
	at com.google.gson.Gson.toJson(Gson.java:618)
	at com.wc.gson.test.GsonJsonignoreTest.test02(GsonJsonignoreTest.java:39)
	at com.wc.gson.test.GsonJsonignoreTest.main(GsonJsonignoreTest.java:19)

Process finished with exit code 1

使用下面的GSON下面这种创建方式可以避免这个问题。

new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

创建Gson对象,没有@Expose注释的属性将不会被序列化 

@Expose标签的2个属性

  1.1 deserialize (boolean) 反序列化 默认 true
 
1.2 serialize  (boolean) 序列化 默认 true

 

public class GsonJsonignoreVO extends ResObtainTokenVO
{
    private static final long serialVersionUID = 4885951893801257633L;

    @Expose
    @SerializedName("userName")
    private String name;

    @Expose
    private String gender;

    private Integer age;

    @Expose
    @SerializedName("IDCard")
    private String idCard;

    @JsonIgnore
    private String token;
}
public class ResObtainTokenVO implements Serializable
{
    private static final long serialVersionUID = 2819018478042731483L;

    private String token;

    @Expose
    private Long expiredMills;
}

运行结果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值