Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Gson Exclude fields during serialization

Tags:

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.

like image 786
ThexBasic Avatar asked Dec 01 '16 11:12

ThexBasic


People also ask

How do I exclude a field from serialization?

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.

Does Gson ignore extra fields?

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.

Does Gson serialize private fields?

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.


2 Answers

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.

like image 167
diogo Avatar answered Sep 20 '22 06:09

diogo


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(); 
like image 33
utkusonmez Avatar answered Sep 19 '22 06:09

utkusonmez