将自定义 JSON 序列化程序与 firebase 结合使用
Use custom JSON serializers with firebase
使用DataSnapshot.getValue()时是否可以得到Json格式为Json的对象或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。
更新:
我没有时间查看最新 SDK 的文档,但看起来 there are some options for JSON fields.
DataSnapshot
return 中的 getValue()
是 HashMap
。
因此,在您的 Firebase 侦听器的任何方法中,您可以:
获取DataSnapshot的值,这会return一个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))
}
}
这是我的名片class
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))
}
谢谢。 :)
使用DataSnapshot.getValue()时是否可以得到Json格式为Json的对象或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。
更新: 我没有时间查看最新 SDK 的文档,但看起来 there are some options for JSON fields.
DataSnapshot
return 中的 getValue()
是 HashMap
。
因此,在您的 Firebase 侦听器的任何方法中,您可以:
获取DataSnapshot的值,这会return一个
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))
}
}
这是我的名片class
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))
}
谢谢。 :)