因此,你要排除
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() <-- uncomment to serialize NULL fields as well .create(); Student src = new Student(); String json = gson.toJson(src); System.out.println(json);
返回:
{ "middleName": "J.", "initials": "P.F", "lastName": "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 }}


