Java Gson在序列化期间排除字段
我有一个ConfigInstance
类,它包含一个password
和一个password_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)
,但它似乎没有任何作用。此外,我已经将该字段设置为private,因为我认为这将“覆盖”@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"
}
那么我做错了什么?我现在很茫然,希望能得到任何帮助,因为THIS似乎不起作用
提前谢谢
# 1 楼答案
这是一个迟来的答案,但它可能会帮助一些人
你只需要做
@Expose(serialize = false, deserialize = false)
或者做你想做的事如果你有},那么根本没有必要有
serialize
和deserialize
{@Expose
创建此类:
然后用GsonBuilder构建Gson
您的ConfigInstance类如下所示
# 2 楼答案
如果你喜欢特定的字段不被序列化,给它一个临时关键字
有关更多信息,请访问https://sites.google.com/site/gson/gson-user-guide#TOC-Finer-Points-with-Objects
# 3 楼答案
如果只想禁用序列化或反序列化,可以使用
@Expose
注释的属性,例如:默认选项为true,因此这里不需要反序列化
# 4 楼答案
这是另一种方式
序列化:
反序列化:
# 5 楼答案
@utkusonmez 尽管所提到的方法是错误的,但这个答案仍然有效。 它应该使用“AddSerializationExclutionStrategy”而不是“AddDeserializationExclutionStrategy”
所以答案看起来是这样的
# 6 楼答案
为了得到这个结果,需要用
@Expose
注释所有字段:并将Gson配置为仅公开带注释的字段,忽略其余字段,如下所示:
然后,你会得到:
此外,当反序列化字符串时,您仍然具有password属性
不过,您仍然可以配置一个Gson Serializer来实现这一点