Gson中忽略特定字段(记录一下,便于查找)
场景
父类A中有多个属性,其中个字段name,子类B继承父类A。子类B在生成json时,想要去掉父类A中的name字段。(该json的生成是用Gson库)
代码如下:
父类代码
public class MyFather {
private String name;
private String sex;
private String height;
private String weight;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* 标记是否有name这个字段
*
* @return
*/
public boolean isHaveName() {
return true;
}
}
子类
public class MySon extends MyFather {
private String job;
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public boolean isHaveName() {
return false;//去掉特定的字段的标记
}
@Override
public String toString() {
return "MySon{" +
"job='" + job + '\'' +
"super.toString[" + super.toString() +
"]}";
}
}
运行代码
public class GsonTest {
public static void main(String[] args) {
MySon sonModel = new MySon();
sonModel.setAge(11);
sonModel.setJob("学生");
sonModel.setHeight("170");
sonModel.setSex("男");
sonModel.setWeight("110");
//
Gson gson = new GsonBuilder().addSerializationExclusionStrategy(new MyExclusionStrategy(sonModel)).create();
//生成json
String gsonStr = gson.toJson(sonModel);
System.out.println("===========gsonStr:" + gsonStr);
}
static class MyExclusionStrategy implements ExclusionStrategy {
MyFather mMyFather;
public MyExclusionStrategy(MyFather mMyFather) {
this.mMyFather = mMyFather;
}
@Override
public boolean shouldSkipField(FieldAttributes f) {
if (!mMyFather.isHaveName() && f.getName() == "name") {
return true; //过滤掉name字段
}
return false;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}
}
补充:
gson库:
implementation 'com.google.code.gson:gson:2.6.2'