【问题标题】:json format for user data using firebase使用firebase的用户数据的json格式
【发布时间】:2016-06-03 10:32:13
【问题描述】:

我正在为我的 android 应用程序使用 firebase。我对 json 中的用户数据有以下结构:

     {  "employee":
        {
          "empone" : {
            "id" : "11",
            "name" : "emponeone"
          },
          "emptwo" : {
            "id" : 10,
            "name" : "emptwo"
          }
        }
}

我正在尝试获取我的 Arrylist 中所有员工的姓名。但是,当我从 firebase 读取数据时,我在 Datasnapshot 对象中获取了员工引用,我无法将其存储到我的 jsonObject 中。我试过以下:

String data1= String.valueOf(dataSnapshot.getValue());

但这给了我以下格式的数据:

  data1= {empone={name=emponeone, id=11}, emptwo={name=emptwo, id=10}}

无论如何,我可以只获取我的数组列表中的名称字段或任何其他格式来获得我想要的员工结构吗?

【问题讨论】:

  • 您能否展示一个重现问题的完整 sn-p?目前我们无法知道dataSnapshot指的是什么,这很难提供帮助。

标签: android json firebase firebase-realtime-database


【解决方案1】:

关注documentation。它有很好的例子和解释。

你需要一个类 Employee 和一个名为 name 的字符串,一个名为 id 的 int 或字符串(因为你在示例中混合了这两个,我不知道。) 最后,像这样转换它:

class Employee {
     String name;
     String id;

     public Employee(){
         //needed for the getValue() method
     }

     //getters, setters, constructors 
}



// Get Employee object and use the values to update the UI
Employee employee = dataSnapshot.getValue(Employee.class);

【讨论】:

    【解决方案2】:

    您得到的输出是 Java 映射的输出,如下所述:AbstractMap#toString

    要获得 JSON 格式的输出,您可以使用以下命令将 Map 转换为 JSON

    JSONObject json = new JSONObject((Map)dataSnapshot.getValue());
    

    【讨论】:

      【解决方案3】:

      实际上,我在我的机器上模拟了你的问题。我在 Firebase 实时数据库中创建了确切的数据库并尝试读取它。

      我发现对于两种不同的情况有两种可能的解决方案。

      1. 当您知道对象的名称时(在本例中为 emponeemptwo

      在这种情况下,您只需将 datasnapshot 转换为 JSONObject,然后通过其名称访问每个对象。

          FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
          DatabaseReference reference = firebaseDatabase.getReference();
          reference = reference.child("employee");
          reference.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                  jsonObject = new JSONObject((Map) dataSnapshot.getValue());
                  try {
      
                      JSONObject empone = jsonObject.getJSONObject("empone");
                      String name = empone.getString("name");
                      JSONObject emptwo = jsonObject.getJSONObject("emptwo");
                      String name2 = empone.getString("name");
                      Log.i(TAG, "onDataChange: name: " + name);
                  } catch (JSONException e) {
                      Log.e(TAG, "onDataChange: JSON Exception: " + e.getLocalizedMessage());
                      e.printStackTrace();
                  }
      
              }
      
              @Override
              public void onCancelled(@NonNull DatabaseError databaseError) {
                  Log.e(TAG, "onCancelled: database error: " + databaseError.getMessage());
              }
          });
      
      }
      

      这是一种乏味且不推荐的方式,但它确实解决了您提到的问题

      1. 当您不知道项目的名称和数量时。 在这种情况下,您需要为 JSONObjects 创建一个模型类。 将每个 JSONObject 分配给该模型类并遍历数据快照 像这样:

        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference reference = firebaseDatabase.getReference();
        reference = reference.child("employee");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    //Getting User object from dataSnapshot
                    Employee employee = data.getValue(Employee.class);
                    Log.i(TAG, "onDataChange:  empname: " + employee.getName());
                }
        
            }
        
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e(TAG, "onCancelled: database error: " + databaseError.getMessage());
            }
        });
        

      这是一种推荐的方法,可以用很少的信息完成工作!

      您可以read completely about Firebase Database,从介绍 JSON 到从 Firestore 中删除文件都在一处!

      【讨论】:

        【解决方案4】:

        你的 dataSnapShot 应该有孩子,你应该遍历他们:

        for (DataSnapshot snapshotChild : snapshot.getChildren()) 
        

        并使用employee.class 解析孩子,这会将员工描述为使用snapshotChild.getValue(employee.class) 的java Bean 类,您可以使用您的bean 类的get 函数检索名称。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-31
          • 2017-12-06
          • 2021-12-13
          • 1970-01-01
          • 2018-06-24
          • 1970-01-01
          • 2021-08-07
          • 2023-04-04
          相关资源
          最近更新 更多