Java Firebase:检索实现映射的类的值<;K、 V>;

Java Firebase:检索实现映射的类的值<;K、 V>;,java,android,firebase,firebase-realtime-database,hashmap,Java,Android,Firebase,Firebase Realtime Database,Hashmap,假设我有数据类: class MyDataClass { ... public Map<String, Object> properties = HashMap() } // later MyDataClass data = snapshot.getValue(MyDataClass.class); 运行此代码后,data.properties没有数据 我想知道是否有可能将数据检索到自定义映射实现 UPD:JSON我试图阅读 { items: { "i

假设我有数据类:

class MyDataClass {
    ...
    public Map<String, Object> properties = HashMap()
}

// later
MyDataClass data = snapshot.getValue(MyDataClass.class);
运行此代码后,data.properties没有数据

我想知道是否有可能将数据检索到自定义映射实现

UPD:JSON我试图阅读

{
  items: {
    "id": {
      "name": "name",
      "properties": {
        "simpleProp1": "value1",
        "simpleProp2": "value2",
        "simpleProp3": "value3",
        "complexProp1": {
          "subPop1": "subVal1"
          ...
        }
      }
    }
  }
}

谢谢

我认为Firebase无法直接使用您的自定义
Map
实现。因此,您可以考虑添加一个简单的数据类来代替:

class MyDataJSON {
    public MyDataJSON() { }
    public String name;
    public Map<String, Object> properties;
}

class MyDataClass {
    MyDataClass(MyDataJSON json) { ... }
    ...
}

我知道这远非完美,但至少您可以完全控制数据库解组过程(以及相应的属性类型)

这段代码似乎对我有用:

public static class MyDataClass {
    public String name;
    public Map<String,Object> properties = new HashMap<String,Object>();

    @Override
    public String toString() {
        return "MyDataClass{" +
                "name='" + name + '\'' +
                ", properties=" + properties +
                '}';
    }
}
印刷品:

MyDataClass{name='name',properties={simpleProp2=value2,simpleProp1=value1,CompleProp1={SubProp1=subVal1},simpleProp3=value3}


为什么要使用MyMap类?您可以直接添加MyDataClass,如下所示
公共类MyDataClass{public HashMap myData;public HashMap getMyData(){return myData;}public void setMyData(HashMap myData){this.myData=myData;}}}
似乎您误解了我的问题。我需要为“属性”使用自定义映射实现。我想知道为什么firebase snapshot.getValue()方法不使用数据填充它?你有没有收到任何错误?@AlexMamo没有错误。在我看来,firebase根本不“理解”MyMap是一个自定义的映射实现,并搜索用于填充数据的属性。由于MyMap firebase中没有属性,请跳过它。为什么需要自定义实现?也许我们会找到另一种方法。我想他想用他的自定义
Map
实现来代替
properties
字段(即他的
MyMap
类)。谢谢你,弗兰克!这个代码也适用于我。但是我想要的是替换新的HashMap();用我自己实现的映射接口。出于测试目的,您可以创建实现Map接口的类,只需将其所有方法调用委托给私有HashMap属性即可。抱歉,延迟了。这需要深入研究。自定义映射类将不起作用。在这种情况下,我们的反序列化没有意识到它是一个集合,因此将其视为一个bean类(序列化各个属性/字段),而不是集合中的项。@abond Nice;)顺便说一句,别忘了投票/接受我的答案,这样我们就可以把这个问题标记为结束。谢谢你,伙计!
MyDataJSON json = snapshot.getValue(MyDataJSON.class);
MyDataClass data = MyDataClass(json);
public static class MyDataClass {
    public String name;
    public Map<String,Object> properties = new HashMap<String,Object>();

    @Override
    public String toString() {
        return "MyDataClass{" +
                "name='" + name + '\'' +
                ", properties=" + properties +
                '}';
    }
}
    ref.addListenerForSingleValueEvent(
            new ValueEventListener() {
               @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
                   MyDataClass data = dataSnapshot.getValue(MyDataClass.class);
                   System.out.println(data);
               }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });