Java Gson在序列化期间排除字段

我有一个ConfigInstance类,其中包含passwordpassword_hash 。 现在我想使用gson序列化对象,但不包括password字段。

 public class ConfigInstance { public String database_address; public int database_port; public String database_user; @Expose(serialize = false) private String database_pass; public String database_pass_hash; public String GetPass() { return database_pass; } public void Encrypt() { /* Creates the hash before serializing*/ } public void Decrypt() { /* Creates the password after deserializing */} } 

正如您所看到的,我尝试过使用@Expose(serialize = false)但它似乎没有做任何事情。 此外,我已经将该字段设置为私有,因为我认为这将“覆盖” @Expose

但运行以下代码:

 private void toFile(File file, ConfigInstance map) { map.Encrypt(); Gson gson = new GsonBuilder().setPrettyPrinting().create(); String jsonConfig = gson.toJson(map); FileWriter writer; try { writer = new FileWriter(file); writer.write(jsonConfig); writer.flush(); writer.close(); } catch (IOException e) { System.out.println("Error exporting config: " + e.toString()); } } 

仍导致以下文件内容没有错误:

 { "database_address": "127.0.0.1", "database_port": 1521, "database_user": "test", "database_pass": "test1234", "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19" } 

那么我做错了什么? 我现在很无能为力,感谢任何帮助,因为这似乎不起作用。

提前致谢。

为了得到这个结果,你需要使用@Expose注释所有字段:

 public class ConfigInstance { @Expose public String database_address; @Expose public int database_port; @Expose public String database_user; @Expose(serialize = false) private String database_pass; @Expose public String database_pass_hash; 

并将Gson配置为仅显示已注释的字段并忽略其余字段,如下所示:

 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create(); 

然后,你会得到:

 { "database_address": "127.0.0.1", "database_port": 1521, "database_user": "test", "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19" } 

此外,在对字符串进行反序列化时,您仍将拥有密码属性。


不过,您仍然可以配置Gson Serializer来实现这一目标。

如果您喜欢特定字段未被序列化,请为其提供一个临时关键字

 private transient String database_pass; 

有关更多信息,请访问https://sites.google.com/site/gson/gson-user-guide#TOC-Finer-Points-with-Objects

这是另一种方式。

 Gson gson = new GsonBuilder() .addDeserializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getName().toLowerCase().contains("fieldName"); } @Override public boolean shouldSkipClass(Class aClass) { return false; } }) .create(); 

@utkusonmez这个答案虽然提到的方法是错误的,但仍然有效。 它应该使用’addSerializationExclusionStrategy’而不是’addDeserializationExclusionStrategy’

所以答案看起来像

 Gson gson = new GsonBuilder() .addSerializationExclusionStrategy(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getName().toLowerCase().contains("fieldName"); } @Override public boolean shouldSkipClass(Class aClass) { return false; } }) .create(); gson.toJson(*OBJ_TO_SERIALIZE*)) 

如果要仅禁用序列化或仅禁用反序列化,可以使用@Expose注释的属性,例如:

 @Expose(serialize = false, deserialize = true) 

默认选项为true,因此这里不需要反序列化。

你可以这样做:

 Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.STATIC) .create(); 

然后在你想要从对象中排除的所有字段中添加修饰符“static”

 @Expose(serialize = false) private static String database_pass; 

您可以使用瞬态修改器或适合您的东西

这是一个迟到的答案,但它可能会帮助某人。

你只需要做@Expose(serialize = false, deserialize = false)或者你想要的。

如果你有serializedeserialize serialize true那么根本不需要@Expose

创建这个类:

 import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; import com.google.gson.annotations.Expose; public class NoModuleExclusionStrategy implements ExclusionStrategy { private final boolean deserialize; public NoModuleExclusionStrategy(boolean isdeserialize) { deserialize = isdeserialize; } @Override public boolean shouldSkipClass(Class clazz) { return false; } @Override public boolean shouldSkipField(FieldAttributes field) { return !(field.getAnnotation(Expose.class) == null || (deserialize ? field.getAnnotation(Expose.class).deserialize() : field.getAnnotation(Expose.class).serialize())); } } 

然后用GsonBuilder构建Gson

 Gson gson = new GsonBuilder() .addSerializationExclusionStrategy(new NoModuleExclusionStrategy(false)) .addDeserializationExclusionStrategy(new NoModuleExclusionStrategy(true)) .create(); 

您的ConfigInstance类如下所示

 { "database_address": "127.0.0.1", "database_port": 1521, "database_user": "test", "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19" } 

这是一个非常简单的解决方案,只有一行代码,没有任何@Expose注释或排除策略。

在Gson中实现的默认行为是忽略空对象字段 。 因此,您需要做的就是在序列化之前将密码字段设置为null。

 map.setPassword(null); // or map.password = null; String jsonConfig = gson.toJson(map); // This won't serialize null password field