本文共 1886 字,大约阅读时间需要 6 分钟。
所以,你想排除 firstName和country.name..这是你的ExclusionStrategy应该看起来像public class TestExclStrat implements ExclusionStrategy {
public boolean shouldSkipClass(Class> arg0) {
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
return (f.getDeclaringClass() == Student.class && f.getName().equals("firstName"))||
(f.getDeclaringClass() == Country.class && f.getName().equals("name"));
}
}
如果你仔细看,它会回来true为Student.firstName和Country.name这就是你想要排除的。
你需要应用这个ExclusionStrategy像这样,Gson gson = new GsonBuilder()
.setExclusionStrategies(new TestExclStrat())
//.serializeNulls()
.create();
Student src = new Student();
String json = gson.toJson(src);
System.out.println(json);
返回:{“中间名”:“J”、“首字母”:“P.F”、“最后名称”:“Fry”、“Country”:{“id”:91}
我假设国家对象是用id = 91L在学生课上。
你可能会觉得花哨。例如,您不希望序列化任何在其名称中包含“name”字符串的字段。这样做:public boolean shouldSkipField(FieldAttributes f) {
return f.getName().toLowerCase().contains("name"); }
这将返回:{ "initials": "P.F", "country": { "id": 91 }}
编辑:添加了更多的信息要求。
这,这个ExclusionStrategy会做的事情,但你需要通过“完全限定字段名”。见下文:public class TestExclStrat implements ExclusionStrategy {
private Class> c;
private String fieldName;
public TestExclStrat(String fqfn) throws SecurityException, NoSuchFieldException, ClassNotFoundException
{
this.c = Class.forName(fqfn.substring(0, fqfn.lastIndexOf(".")));
this.fieldName = fqfn.substring(fqfn.lastIndexOf(".")+1);
}
public boolean shouldSkipClass(Class> arg0) {
return false;
}
public boolean shouldSkipField(FieldAttributes f) {
return (f.getDeclaringClass() == c && f.getName().equals(fieldName));
}
}
以下是我们如何泛化使用它。Gson gson = new GsonBuilder()
.setExclusionStrategies(new TestExclStrat("in.naishe.test.Country.name"))
//.serializeNulls()
.create();
Student src = new Student();
String json = gson.toJson(src);
System.out.println(json);
它返回:{ "firstName": "Philip" , "middleName": "J.", "initials": "P.F", "lastName": "Fry", "country": { "id": 91 }}
转载地址:http://svqll.baihongyu.com/