我有一个ConfigInstance
包含a
password
和a的类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)
但是似乎没有任何作用。另外,我已经将该字段设置为私有,因为我认为这会“覆盖”@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"
}
同样,在反序列化字符串时,您还将仍然具有password属性。
不过,您仍然可以配置Gson序列化器来完成此操作。
主要内容:使用excludeFieldsWithModifiers()方法,使用@Expose注解默认情况下,GSON排除序列化/反序列化过程中的瞬态和静态字段。 我们来看看下面的例子。 示例 创建一个名为的Java类文件:GsonTester.java - 执行上面示例代码,得到以下结果 - 使用excludeFieldsWithModifiers()方法 GsonBuilder使用序列化/反序列化过程中的方法提供对使用特定修饰符排除字段的控制。 看下面的例子。 示例 创建一个名为的Java
问题内容: 我找不到在Gson进行序列化期间添加自定义字段的简单方法,我希望其他人可以提供帮助。 这是一个示例类来展示我的问题: 当我序列化类AI时,想返回以下内容: 其中url_to_user未存储在我的类A的实例中,但可以与数据一起在类A的实例中生成。 有没有简单的方法可以做到这一点?我宁愿避免只添加一个字段就编写整个序列化程序。 问题答案: 用得到,用它可以动态交互。
在我们的项目(springMVC)Rest API项目中,我希望只对请求和响应使用一个模型(以避免添加大量代码将字段从一个对象复制到另一个对象) 我想用昂首阔步来处理所有的医生,但我遇到了一个小问题。例如,假设我有一个模型用户 和一个简单的控制器 现在,我希望swagger在反序列化时隐藏属性密码,而不是序列化(因此,在输入时显示它,但在输出时显示它),在Id字段中则相反。 我尝试使用@jsoni
问题内容: 我有一个对象,即时通讯读取和写入,并从和。我不断收到Java期望的错误,但发现了另一个。 在我的课堂上,我已经实现并拥有一个我认为足够的领域。 我是Java序列化的新手。我在这里想念什么? 编辑 如果有关系,我实际上是在尝试读写 这是完整的痕迹: 问题答案: 您正在读取文件吗?在这种情况下,是否立即添加serialVersionUID无关紧要,它不同于文件中存储的那个,并且会创建异常。
映射器: 要序列化的类: 我不懂这个领域: 从Jackson那里找到的?我用日志检查了我的本地地图,结果发现这个字段不存在,但在序列化过程中它出现了。
默认情况下,GSON从序列化/反序列化过程中排除瞬态和静态字段。 我们来看看下面的例子。 例子 (Example) 在C:\“GSON_WORKSPACE中创建名为GsonTester的Java类文件。 File: GsonTester.java import com.google.gson.Gson; import com.google.gson.GsonBuilder; public c