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

依赖包:


    
      com.google.code.gson
      gson
      2.8.5
    

    
      org.projectlombok
      lombok
      true
    

    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.5
    

下面没有生成对应的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;
}

运行结果如图:

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

 

由于使用的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;
}

运行结果如图:

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

你可能感兴趣的:(Java后台)