【发布时间】:2016-02-17 22:10:48
【问题描述】:
使用DataSnapshot.getValue()时是否可以获取Json格式的JsonObjects或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。
【问题讨论】:
标签: android firebase firebase-realtime-database
使用DataSnapshot.getValue()时是否可以获取Json格式的JsonObjects或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。
【问题讨论】:
标签: android firebase firebase-realtime-database
更新: 我没有时间查看最新 SDK 的文档,但它看起来像 there are some options for JSON fields。
DataSnapshot 中的 getValue() 返回一个 HashMap。
因此,在您的 Firebase 侦听器的任何方法中,您都可以:
获取DataSnapshot的值,会返回一个HashMap:
HashMap<String, JSONObject> dataSnapshotValue = (HashMap<String, JSONObject>) dataSnapshot.getValue();
使用 Gson 将 Hashmap 转换为有效的 JSON 字符串:
String jsonString = new Gson().toJson(dataSnapshotValue);
使用这个有效的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 转换对象的东西,您可以使用自定义序列化程序、ExclusionStrategy,或者直接从 HashMap 检索一些值。
【讨论】:
基于@RominaV 的回答,如果它可能对我在 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))
}
}
这就是我的 Card 类
data class Card(var courseId: String, var cardQuestion: String, var cardAnswer: String) {
constructor() : this("", "", "")
}
我也可以通过这种方式遍历 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))
}
谢谢。 :)
【讨论】: