我想知道Firebase如何将POJO对象序列化/反序列化为json,是否使用Jackson或Gson或其他类似的库。
我对Firebase的命名约定有困难。我的模特有点像这样:
class Data {
private String someFieldName;
private String anotherFieldName;
public Data() {}
public void setSomeFieldName(String) {...}
public String getSomeFieldName(String) {...}
public void setAnotherFieldName(String) {...}
public String getAnotherFieldName() {...}
}
Firebase中的预期结果应为:
{
"some_field_name" : "...",
"another_field_name" : "..."
}
Gson 我可以将FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES
用于我的目的,就像在Gson doc中一样:
这里有一些表格" Java Field Name" ---> " JSON字段名称":
- someFieldName ---> some_field_name
_someFieldName ---> _some_field_name
aStringField ---> a_string_field
- aURL ---> a_u_r_l
如何将我的POJO对象转换为" Firebase值"具体的命名约定,反之亦然,或者有什么方法可以自定义序列化/反序列化过程?
谢谢!
答案 0 :(得分:19)
从Firebase数据库中读取数据时,您可以使用@PropertyName
注释标记要在序列化/反序列化时重命名的字段,如下所示:
@IgnoreExtraProperties
class Data {
@PropertyName("some_field_name")
public String someFieldName
@PropertyName("another_field_name")
private String anotherFieldName;
public Data() {}
}
确保您的字段是公开的而不是私有的,否则注释将无效(我也相信Firebase使用Jackson来处理引擎盖下的对象映射,但不认为您可以实际定制它如何使用它)。
答案 1 :(得分:4)
我个人更喜欢保持对序列化/反序列化过程的明确控制,而不是依赖于特定的框架和/或注释。
您的数据类可以像这样简单地修改:
class Data {
private String someFieldName;
private String anotherFieldName;
public Data() {}
public Data(Map<String, Object> map) {
someFieldName = (String) map.get("some_field_name") ;
anotherFieldName = (String) map.get("another_field_name") ;
}
public Map<String, Object> toMap() {
Map<String, Object> map = new HashMap<>();
map.put("some_field_name", someFieldName);
map.put("another_field_name", anotherFieldName);
return map ;
}
}
要将值写入firebase,只需执行以下操作:
dbref.setValue(data.toMap());
阅读:
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
data = new Data(map);
这个解决方案有一些优势:
toMap()
和构造函数外部化到DataMapper(下面的代码段)来进一步将对象模型与Json模型分离。public static Data fromMap(Map<String, Object> map) {
String someFieldName = (String) map.get("some_field_name") ;
String anotherFieldName = (String) map.get("another_field_name") ;
return new Data(someFieldName, anotherFieldName);
}
public static Map<String, Object> toMap(Data data) {
Map<String, Object> map = new HashMap<>();
map.put("some_field_name", data.getSomeFieldName());
map.put("another_field_name", data.getAnotherFieldName());
return map ;
}