【问题标题】:Java Get Value from Object by Key NameJava 通过键名从对象中获取值
【发布时间】:2017-10-27 10:29:27
【问题描述】:

我已从 Firebase 检索到一个对象,并希望使用我希望为其获取值的每个字段的名称来访问它的值。在 javascript 中,这就像 myObject.name 检索对象中的名称一样简单。

如何在 Java 中做同样的事情?

mDatabase = FirebaseDatabase.getInstance().getReference();
user = FirebaseAuth.getInstance().getCurrentUser();
userId = user.getUid();

ValueEventListener myObjectListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Log.i(TAG, "getting data");
        Object myObject = dataSnapshot.getValue();

        Log.v(TAG, myObject.toString()); 
        // Outputs: {name= "john doe", hair="brown", isStudent=true, age=12} 

        // HERE is where I would like to get the name.
        // DOES NOT work. Have also attempted things like
        // myObject.getString("name"), etc.
        myObject.getClass().getFieldName("name") 
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    }
};

mDatabase.child("users").child(userId).addValueEventListener(myObjectListener);

【问题讨论】:

标签: java json object firebase firebase-realtime-database


【解决方案1】:

试试这个:

@SuppressWarnings("unchecked")
Map<String, Object> user = (Map<String, Object>) dataSnapshot.getValue();
String name = (String) user.get("name");
String hair = (String) user.get("hair");
long age    = (Long)   user.get("age");
...

如果你有一个 properly defined User 类,那么这会更好:

User user = dataSnapshot.getValue(User.class);
String name = user.getName();
String hair = user.getHair();
...

最后,还有第三种选择(使用DataSnapshot.child(String) 方法):

String name = (String) dataSnapshot.child("name").getValue();
String hair = (String) dataSnapshot.child("hair").getValue();
...

【讨论】:

  • 完美。谢谢@Paulo Mattos。非常感激。第一个选项效果很好,在我的情况下与第二个选项相比是必要的,因为对象的属性可能不同(即hair 不存在),尽管我一开始并没有想到要提到这一点(我在那里不好)。再次感谢
  • @Rbar 不错!很高兴为您提供帮助;)
  • 一个建议的编辑是 String age = (String) user.get("age") 在我尝试将它从长类型转换为字符串时崩溃,但将其更改为 string.valueOf(user.get("age")) 就像一个魅力,并且仍然适用于像 getName 这样的字符串和getHair
  • @Rbar ...另一种解决方案是将类型转换为Long ;)
【解决方案2】:

它对我很有效。

String email = (String) ((LinkedHashMap) responseEntity.getBody().getPayload()).get("emailAddress");

【讨论】:

    【解决方案3】:

    假设您获取对象“o”,并且您想要获取字段名称“userName”的值。

    (String) ((LinkedHashMap) o).get("userName")

    【讨论】:

    • Object o 没有方法 get()Cannot find symbol
    • 有类型转换。 LinkedHashMap 有一个函数 get(),如果 key userName 存在,它将给出值。
    猜你喜欢
    • 2021-01-26
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多