I have a ConfigInstance
class which contains a password
and a password_hash
. Now I want to serialize the object using gson but exclude the password
field.
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 */} }
As you can see, I have tried using @Expose(serialize = false)
but it doesn't seem to do anything. Also I already set the field to private since I figured that this would "override" the @Expose
but running following code:
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()); } }
still results in the following file content without Errors:
{ "database_address": "127.0.0.1", "database_port": 1521, "database_user": "test", "database_pass": "test1234", "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19" }
So what am I doing wrong? I am pretty clueless right now and would appreciate any help since THIS doesn't seem to work.
Thanks in advance.
If there are fields in Java objects that do not wish to be serialized, we can use the @JsonIgnore annotation in the Jackson library. The @JsonIgnore can be used at the field level, for ignoring fields during the serialization and deserialization.
3. Deserialize JSON With Extra Unknown Fields to Object. As you can see, Gson will ignore the unknown fields and simply match the fields that it's able to.
In this example you'll see how the Gson library handles the object fields. For object fields to be serialized into JSON string it doesn't need to use any annotations, it can even read private fields.
In order to get this result, you need to annotate all the fields with the @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;
And configure Gson to only expose fields that are annotated and ignore the rest as shown in the following:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
Then, you'll get:
{ "database_address": "127.0.0.1", "database_port": 1521, "database_user": "test", "database_pass_hash": "B9FE2C011B59F0D0D383D70073E48A19" }
Also, when deserialising the string you'll still have the password attribute as well.
Still, you have the possibility to configure a Gson Serializer to accomplish this.
This is another way.
serialization:
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();
deserialization:
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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With