【问题标题】:Use custom JSON serializers with firebase使用带有 firebase 的自定义 JSON 序列化程序
【发布时间】:2016-02-17 22:10:48
【问题描述】:

使用DataSnapshot.getValue()时是否可以获取Json格式的JsonObjects或字符串?也许我的搜索不够彻底,但我找不到使用自定义序列化程序的方法。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    更新: 我没有时间查看最新 SDK 的文档,但它看起来像 there are some options for JSON fields


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

    1. 获取DataSnapshot的值,会返回一个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 检索一些值。

    【讨论】:

    • 我有人从 Firebase 团队看到了这个:多么丑陋的解决方案!转换为 HashMap -> 转换为 JSON-String -> 序列化为特定类型。
    • @MikeMitterer 我猜你有更好的方法!点击“添加另一个答案”并启发我们。
    • 对不起,这并不是对答案的批评。该帖子是针对 FB 团队及其对 GSON 的不良支持!
    • @MikeMitterer 哦,好吧,那么抱歉
    • 我可以支持 Mike 的评论,现在是 2018 年,您仍然无法注册自定义序列化器...,真是浪费资源
    【解决方案2】:

    基于@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))
    }
    

    谢谢。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 2020-12-04
      • 2021-09-21
      • 2016-12-09
      • 2014-08-02
      • 1970-01-01
      相关资源
      最近更新 更多