Firebase通用地将地图解析为列表

7 浏览
0 Comments

Firebase通用地将地图解析为列表

我正在尝试设置一个通用类从Firebase中检索数据,但我在解析部分卡住了。

override fun onDataChange(snapshot: DataSnapshot) {

try {

val data: T? = snapshot.getValue(dataType)

onDataReadFromDatabase(data, d, snapshot, changeListener)

} catch(e: Exception) {

d.resumeWithException(e)

}

}

T 是我的数据类型,dataTypeClass。对于平铺的数据结构,这个工作得很好,但当 T 的子节点是 list 时,它会失败,显示 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"}

}

}

使用这样的模型:

data class ItemList(val id: String, val name: String, val items: MutableList) {

...

}

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

我希望Firebase解析器有一种方式可以说:每当你需要将一个映射转换为列表时,请使用函数x

0
0 Comments

问题:Firebase泛型地将映射解析为列表的原因和解决方法

在使用Firebase进行数据解析时,如果需要将映射(HashMap)解析为列表(List),需要编写自定义的反序列化器(Deserializer)并循环遍历获取HashMap的值。以下是解决该问题的步骤:

1. 首先,编写一个自定义的反序列化器:

public class UserDetailsDeserializer implements JsonDeserializer {
   public AllUserDetailsKeyModel deserialize(JsonElement json, Type typeOfT,
      JsonDeserializationContext context) throws JsonParseException {
      final JsonObject jsonObject = json.getAsJsonObject();
      Gson gson = new Gson();
      Type AllUserDetailsResponseModel = new TypeToken>(){}.getType();
      HashMap user = gson.fromJson(jsonObject, AllUserDetailsResponseModel);
      AllUserDetailsKeyModel result = new AllUserDetailsKeyModel();
      result.setResult(user);
      return result;
   }
}

2. 在REST客户端中将自定义反序列化器添加到Gson转换器中:

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

3. 创建一个包含HashMap成员变量的模型类:

public class AllUserDetailsKeyModel {
   private Map result;
   public Map getResult() {
      return result;
   }
   public void setResult(Map result) {
      this.result = result;
   }
}

4. 在响应的回调方法中,通过循环遍历HashMap获取值:

// 假设response为包含HashMap的对象
for (Map.Entry entry : response.getResult().entrySet()) {
   String key = entry.getKey();
   AllUserDetailsResponseModel value = entry.getValue();
   // 处理获取到的值
}

5. 最后,在Retrofit中设置自定义转换器:

.addConverterFactory(createGsonConverter())

通过以上步骤,可以解决Firebase泛型地将映射解析为列表的问题。如果需要更多解释,请告知。

0
0 Comments

Firebase泛型解析将地图解析为列表的问题的出现原因是,JSON实际上不包含一个列表,而是一个子对象,其中包含字段"a"、"b"等,该子对象反序列化为一个HashMap。解决方法是将数据更改为一个列表,或者将数据类字段更改为Map类型,其中地图键为"a"、"b"等。

0
0 Comments

问题的原因是`items`不是一个JSON数组,而是一个JSON对象。在JSON对象中,使用map。因为在map中,有一个“键-值”对,因此可以通过键来区分每个对。

解决方法是使用`data class ItemList(val id: String, val name: String, val items: MutableMap)`来定义`ItemList`类,这将解决这个问题。如果需要更多解释,请告诉我。

0