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.
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.
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;
}
}
@PropertyName :
Marks a field to be renamed when serialized. link
you have to use @PropertyName
with public fields and no need for getters/setters
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.
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