Android 在firebase中使用自定义JSON序列化程序

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()时,是否可以获取Json格式的JSONObject或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。

更新: 我还没来得及查看最新SDK的文档,但看起来好像是


DataSnapshot
中的
getValue()
返回一个
HashMap
。 因此,在Firebase侦听器的任何方法中,您都可以:

  • 获取DataSnapshot的值,它将返回一个
    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))
    }