【问题标题】:Android Firebase - Can't receive proper JSON from Firebase snapshotAndroid Firebase - 无法从 Firebase 快照接收正确的 JSON
【发布时间】:2016-05-07 17:17:29
【问题描述】:

我的 android 应用连接到 Firebase 并提取由我的服务器发送到那里的“警报对象”。

当我从 Firebase 导出数据时,我得到了格式精美的 JSON 数据表示。

问题: 当我使用 DataSnapshot 将数据拉到我的 android 设备时,数据有 '='(等号)而不是 ':'(分号)。也没有引号。

当我尝试执行JSONObject alert = new JSONObject(data.getValue().toString()); 之类的操作时,我会因为明显的原因而出错。我说的很明显,因为如果您查看我的代码打印到控制台的内容,您会发现它不再是有效的 JSON 格式。

一位朋友提到我需要对编码做一些事情,但我们没有时间讨论它。

如何遍历我创建的这些(有点奇怪)警报对象并将它们转换为我的 Java 中的 JSON 对象,以便我可以访问它们的属性,例如 alert.datealert.message

我认为屏幕截图可以帮助您了解我在做什么。火力基地根本没有固定,所以你可以随意看看。它不会做太多事情,当我投入生产时,无论如何我都会移动它。

我确信这是一个非常容易回答的问题,我只是不太精通 JSON 和编码作为一个整体。

谢谢!

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为作为文本的实际 JSON,您可以通过单击 Firebase 数据库中的“导出”按钮轻松获取该文本。将 JSON 作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据并在我们的答案中使用它,通常只是一件好事(tm)。
  • @FrankvanPuffelen 这是 Firebase 导出文本的屏幕截图。我现在正在使用手机,但是当我回到家时,我会加载可搜索的文本。你所看到的是其中的 99%。只剩下几行了。

标签: java android json encoding firebase


【解决方案1】:

你可以使用 gson 库

       public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            /*JSONObject jsonObject = null;
            try {
                jsonObject=new JSONObject();

            } catch (JSONException e) {
                e.printStackTrace();
            }*/
            Gson gson = new Gson();
            String s1 = gson.toJson(dataSnapshot.getValue());
            JSONArray object = null;
            try {
                object = new JSONArray(s1);
            } catch (JSONException e) {
                e.printStackTrace();
            }

            JSONArray jsonArray = object;

            Log.e("string", s1);

        }

【讨论】:

    【解决方案2】:

    您无法在 Java 中本地访问 JSON。

    但是Firebase DataSnapshot class 提供了您需要的一切。

    如果您的屏幕截图中有fbAlerts 处的数据DataSnapshot,您可以打印每个日期+消息和收件人:

    for (DataSnapshot alert: alerts.getChildren()) {
      System.out.println(alert.child("date").getValue();
      System.out.println(alert.child("message").getValue();
      for (DataSnapshot recipient: alert.child("recipients").getChildren()) {
        System.out.println(recipient.child("name").getValue();
      }
    }
    

    或者,您可以构建一个表示警报的 Java 类。有关示例,请参阅 Firebase guide on reading data in Android

    【讨论】:

    • 谢谢你,很抱歉我的回复晚了。在发布问题后,我几乎立即弄清楚了这一点。好吧,我已经知道了大部分,我只是希望有一个更简单的方法。我的代码现在有点......粗鲁?......但它让每个孩子都使用这些 for 循环并正确构建我的对象。再次感谢!
    • @Frank 链接已损坏。
    • 已更新。感谢举报。
    【解决方案3】:

    用这种方式将jsonObject从dataSnapshot转换成dataSnapshot

    Map<String, String> value = (Map<String, String>) dataSnapshot.getValue();
    Log.i("dataSnapshot", "dataSnapshot" + new JSONObject(value));
    

    【讨论】:

    • 我们如何将其转换回 Datasnapshot?
    【解决方案4】:

    从上面的代码摘录中,看起来你有一个 JSONArray 而不是 JSONObject。

    在这种情况下,您需要执行以下操作:

    // Find the right array object
    JSONArray jsonArray = response.getJSONArray("fbAlerts"); 
    
    // Loop through the array
    for (int i=0; i< jsonArray.length(); i++) {
        JSONObject myObj = jsonArray.getJSONObject(i); 
        strMsg = myObj.getString("message");
    } 
    

    在示例中 - 当您有重复组时,这似乎表示一个数组,因此需要一个迭代器来访问对象内容。

    【讨论】:

    • 感谢您的回答。我最终只是遍历了每个父母的孩子,实际上是几个“孩子”,并手动构建了我的对象。
    猜你喜欢
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 2019-03-20
    相关资源
    最近更新 更多