Android 在firebase中使用自定义JSON序列化程序
使用DataSnapshot.getValue()时,是否可以获取Json格式的JSONObject或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。更新: 我还没来得及查看最新SDK的文档,但看起来好像是Android 在firebase中使用自定义JSON序列化程序,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,使用DataSnapshot.getValue()时,是否可以获取Json格式的JSONObject或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。更新: 我还没来得及查看最新SDK的文档,但看起来好像是 DataSnapshot中的getValue()返回一个HashMap。 因此,在Firebase侦听器的任何方法中,您都可以: 获取DataSnapshot的值,它将返回一个HashMap: HashMap<String, JSONObject> data
DataSnapshot
中的getValue()
返回一个HashMap
。
因此,在Firebase侦听器的任何方法中,您都可以:
HashMap
:
HashMap<String, JSONObject> dataSnapshotValue = (HashMap<String, JSONObject>) dataSnapshot.getValue();
jsonString
,根据需要强制转换它:
final GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(User.class, new UserSerializer());
final Gson gson = gsonBuilder.create();
User parsedUser = gson.fromJson(jsonString, User.class);
这使您可以使用任何您想要从Firebase强制转换对象的东西,您可以使用自定义序列化程序,或者直接从
哈希映射中检索一些值。基于@RominaV answer,如果它可能对我在Kotlin中所拥有的人有所帮助:
myRef.addValueEventListener(object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
adapter.clear()
dataSnapshot.children.forEach {
val cardMap = it.value
val json = Gson().toJson(cardMap)
val card = Gson().fromJson<Card>(json, Card::class.java)
adapter.add(CardItem(card))
}
}
我还可以通过这种方式遍历dataSnapshot子对象获得相同的结果:
dataSnapshot.children.forEach {
adapter.clear()
val courseId = it.child("courseId").value as String
val question = it.child("cardQuestion").value as String
val answer = it.child("cardAnswer").value as String
adapter.add(CardItem(Card(courseId, question, answer))
}
谢谢。:) 我从Firebase团队中看到了这一点:多么丑陋的解决方案!转换为HashMap->转换为JSON字符串->序列化为特定类型。@Mikemiter我想你有更好的方法了!点击“添加另一个答案”并启发我们。对不起,伙计-这并不是对答案的批评。该帖子是针对FB团队和他们糟糕的GSON支持@MikeMitterer哦,好吧,对不起,我可以支持Mike的评论,现在是2018年,你仍然无法注册自定义序列化程序…,真是浪费资源
data class Card(var courseId: String, var cardQuestion: String, var cardAnswer: String) {
constructor() : this("", "", "")
}
dataSnapshot.children.forEach {
adapter.clear()
val courseId = it.child("courseId").value as String
val question = it.child("cardQuestion").value as String
val answer = it.child("cardAnswer").value as String
adapter.add(CardItem(Card(courseId, question, answer))
}