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是我的数据类型,dataType是Class<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.
您需要编写一个自定义反序列化器,然后循环它并获取 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())
如果您需要更多说明,请告诉我。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |