8

I created an object to send some data to firebase. As an example, I use firebase user example:

public class User {
    public String username;
    public String email;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }
}

I want to encode property names that are sent to firebase. Currently keys are sent using variable names. I want to encode keys something like Useraname and Email, like Gson is doing. I don't want to change variable names.

@SerializateName("Username")
public String username;
@SerializateName("Username")
public String email;

I used @SerializateName(), but is not working. Same with @PropertyName that is used by Firebse, is not working. What I can use in order to serializare custom keys?

Update 1

public class Pojo {
    @PropertyName("Guid")
    public String guid;

   @PropertyName("Name")
   public String name;

   public String getPojoGuid() {
       return guid;
   }

   public void setPojoGuid(String guid) {
       this.guid = guid;
   }
}

As you can see in the image, it saves keys based on variable names. I changed property name from annotation for one field and when i save it, it ignores it, but when i change variable name, it save as new entry with key for that new varialbe name.

enter image description here

In this documentation is a method toMap(). If i do like that, is working (is not convenient for me), but is not working with @PropertyName.

Update 2

If i mark getters and setters with @Exclude and class with @IgnoreExtraProperties is working. I don't have to use toMap() method example from documetation. Is using specified name from @PropertyName. Not a good thing in my opinion, create confuses.

Cătălin Florescu
  • 5,012
  • 1
  • 25
  • 36

3 Answers3

20

The Firebase SDK uses the annotation it finds for the property whenever it gets or sets its value. That means you need to consider how Firebase gets/sets the value, and annotate each place it looks.

Since you're declaring a getter method, Firebase will use that to get the value of the property. It will use the field for setting the value. So the annotation needs to be on both:

public class Pojo {
   @PropertyName("Guid")
   public String guid;

   @PropertyName("Name")
   public String name;

   @PropertyName("Guid")
   public String getPojoGuid() {
       return guid;
   }

   @PropertyName("Guid")
   public void setPojoGuid(String guid) {
       this.guid = guid;
   }
}

If you'd have getters and setters, the annotation would need to be on those, but not on the fields anymore:

public class Pojo {
   private String guid;
   private String name;

   @PropertyName("Guid")
   public String getPojoGuid() {
       return guid;
   }

   @PropertyName("Guid")
   public void setPojoGuid(String value) {
       guid = value;
   }

   @PropertyName("Name")
   public void setPojoGuid(String guid) {
       this.guid = guid;
   }

   @PropertyName("Name")
   public void setPojoGuid(String value) {
       name = value;
   }
}
Cătălin Florescu
  • 5,012
  • 1
  • 25
  • 36
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
3

What you are looking for is the feature of SDK Version 9.2 in which you can now use a new @PropertyName attribute to specify the name to use when serializing a field from a Java model class to the database. This replaces the @JsonProperty attribute.

@PropertyName("Username")
public String username;
@PropertyName("Email")
public String email;

See also this post in which Frank van Puffelen explains very clearly this concept.

Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
2

@PropertyName :

Marks a field to be renamed when serialized. link

you have to use @PropertyName with public fields and no need for getters/setters

Oussema Aroua
  • 5,225
  • 1
  • 24
  • 44
  • 1
    Is not working. It update keys with same variable name, like `username`, not `@PropertyName("Username")` – Cătălin Florescu Jul 25 '17 at 15:07
  • Can you help me with this [question](https://stackoverflow.com/questions/47438092/in-app-billing-connect-to-firebase-and-get-products) please? – StuartDTO Nov 27 '17 at 09:33