Firebase将地图解析为列表

MHo*_*gge 6 parsing android kotlin firebase firebase-realtime-database

我正在尝试设置一个通用类来从Firebase检索数据,但我仍然坚持解析部分.

override fun onDataChange(snapshot: DataSnapshot) {
    try {
        val data: T? = snapshot.getValue(dataType)
        onDataReadFromDatabase(data, d, snapshot, changeListener)
    } catch(e: Exception) {
        d.resumeWithException(e)
    }
} 
Run Code Online (Sandbox Code Playgroud)

T是我的数据类型,dataTypeClass<T>.这适用于平面数据结构,但是当它list的子T节点失败时Expected a List while deserializing, but got a class java.util.HashMap.

失败的数据结构示例:

{
    "id": "xxx",
    "name": "test",
    "items": {
        "a": {"name": "itemA"},
        "b": {"name": "itemB"},
        "c": {"name": "itemC"},
        "d": {"name": "itemD"}
    }
}
Run Code Online (Sandbox Code Playgroud)

使用这样的模型:

data class ItemList(val id: String, val name: String, val items: MutableList<Item>) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道有一种方法可以通过循环来解析孩子,就像在这里说的那样,但这是通过知道项目的类.

我期望的是一种对Firebase解析器说话的方式:每次需要将地图转换为列表时,请使用函数x.

bv *_*hil 2

您需要编写一个自定义反序列化器,然后循环它并获取 hasmap 的值。

自定义解串器:-

public class UserDetailsDeserializer implements JsonDeserializer<AllUserDetailsKeyModel> {
  /*
    bebebejunskjd:{
      "email": "akhilbv1@gmail.com",
          "mobileNum": "12345678",
          "password": "1234567",
          "username": "akhil"}*/
  @Override public AllUserDetailsKeyModel deserialize(JsonElement json, Type typeOfT,
      JsonDeserializationContext context) throws JsonParseException {

    final JsonObject jsonObject = json.getAsJsonObject();

    Gson gson = new Gson();

    Type AllUserDetailsResponseModel =
        new TypeToken<HashMap<String, AllUserDetailsResponseModel>>(){}.getType();

    HashMap<String, AllUserDetailsResponseModel> user =
        gson.fromJson(jsonObject, AllUserDetailsResponseModel);
    AllUserDetailsKeyModel result = new AllUserDetailsKeyModel();
    result.setResult(user);
    return result;
  }


}
Run Code Online (Sandbox Code Playgroud)

注释中的代码是我的对象模型,您应该用您的模型类替换AllUserDetailsKeyModel,并将其添加到其余客户端,如下所示:-

private Converter.Factory createGsonConverter() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(AllUserDetailsKeyModel.class, new UserDetailsDeserializer());
    Gson gson = gsonBuilder.create();
    return GsonConverterFactory.create(gson);
  }
Run Code Online (Sandbox Code Playgroud)

这是用于改造的自定义转换器。

在你的 onResponse 中,你只需循环 hasmaps 并通过键获取值,我的模型类如下所示:-

public class AllUserDetailsKeyModel {

  private Map<String, AllUserDetailsResponseModel> result;

  public Map<String, AllUserDetailsResponseModel> getResult() {
    return result;
  }

  public void setResult(Map<String, AllUserDetailsResponseModel> result) {
    this.result = result;
  }

}
Run Code Online (Sandbox Code Playgroud)

可能您需要给出一个类型 T,其中 T 是您的数据类型,而我的模型仅包含哈希映射以及 getter 和 setter。

最后将自定义转换器设置为改造如下:- .addConverterFactory(createGsonConverter())

如果您需要更多说明,请告诉我。