将自定义 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 侦听器的任何方法中,您可以:

  1. 获取DataSnapshot的值,这会return一个HashMap:

    HashMap<String, JSONObject> dataSnapshotValue = (HashMap<String, JSONObject>) dataSnapshot.getValue();
    
  2. 使用 Gson 将 Hashmap 转换为有效的 JSON 字符串:

    String jsonString = new Gson().toJson(dataSnapshotValue);
    
  3. 有了这个有效的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))
}

谢谢。 :)