依赖包:
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;
}
运行结果如图:
由于使用的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;
}
运行结果如图: