使用Firebase序列化/反序列化命名约定?

时间:2016-11-19 08:10:51

标签: android json firebase firebase-realtime-database

我想知道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值"具体的命名约定,反之亦然,或者有什么方法可以自定义序列化/反序列化过程?

谢谢!

2 个答案:

答案 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);

这个解决方案有一些优势:

  • 没有对基础json框架做出假设
  • 无需使用注释
  • 您甚至可以通过将方法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 ;
}