【问题标题】:UnrecognizedPropertyException when reading data from Firebase从 Firebase 读取数据时出现 UnrecognizedPropertyException
【发布时间】:2016-09-19 06:48:06
【问题描述】:

我正在尝试读取存储在 Firebase 数据库中的值。这是数据库的样子:

网址:https://xxxx.firebaseio.com/Cohesion/Passes/Away/Arsenal

现在,在 Android 方面,这就是我尝试检索数据的方式:

    Firebase mRef = new Firebase("https://xxxx.firebaseio.com/Cohesion/Passes/Away/Arsenal");

    mRef.addValueEventListener(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            Arsenal vals = dataSnapshot.getValue(Arsenal.class);
            Log.e("retValue",""+vals);

        }

        @Override
        public void onCancelled(FirebaseError firebaseError)
        {
            Log.e("REAL_ERROR",""+firebaseError);

        }
    });

Arsenal.class

public class Arsenal {

    private int Cross;
    private int LongBall;
    private int ShortPass;
    private int ThroughBall;

    public Arsenal()
    {

    }

    public Arsenal(int Cross,int LongBall,int ShortPass,int ThroughBall)
    {
        this.Cross = Cross;
        this.LongBall = LongBall;
        this.ShortPass = ShortPass;
        this.ThroughBall = ThroughBall;
    }
    public int getCross() {
        return Cross;
    }


    public int getLongBall() {
        return LongBall;
    }


    public int getShortPass() {
        return ShortPass;
    }


    public int getThroughBall() {
        return ThroughBall;
    }


}

我已将控制台中的Rules 设置为true,以便可以公开访问以进行读写,因此我无需使用身份验证即可访问。

这里是 Logcat:

09-19 12:14:51.032 13585-13585/com.ihrd.myapplication E/AndroidRuntime: 致命异常: main 进程:com.ihrd.myapplication,PID:13585 主题:主题:{} com.firebase.client.FirebaseException:无法反弹输入 在 com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185) 在 com.ihrd.myapplication.MainActivity$1.onDataChange(MainActivity.java:28) 在 com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:53) 在 com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 在 com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5461) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 造成的: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别的字段“Cross”(com.ihrd.myapplication.Arsenal 类),不是 标记为可忽略(0 个已知属性:]) 在 [来源:java.io.StringReader@e1c14e3;行:1,列:12] (通过引用链:com.ihrd.myapplication.Arsenal["Cross"]) 在 com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) 在 com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034) 在 com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183) 在 com.ihrd.myapplication.MainActivity$1.onDataChange(MainActivity.java:28) 在 com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:53) 在 com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 在 com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5461) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

可能是什么原因造成的?以及如何解决?请帮助。

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

当找到具有 getter 和 setter 的类时,Firebase 使用 JavaBean 命名约定来确定底层 JSON 属性名称。

这意味着

public class Arsenal {
    private int Cross;

    public int getCross() {
        return Cross;
    }
}

转换成这个 JSON:

cross: 19

您会发现情况有所不同。据我所知,您有几个选择:

1 - 更改 JSON 属性的大小写

如果您在 JOSN 中以小写字符开头的属性名称,则可以使用当前代码:

cross: 19

2 - 使用公共字段而不是 getter/setter

如果您只有公共字段,Firebase 将使用这些字段的确切名称进行 JSON 映射:

public class Arsenal {
    public int Cross;
}

3 - 注释类以获得正确的映射

最终的解决方案是在类上放一个注解,帮助 Firebase 找到对应的 JSON 属性。

由于您使用的是 Firebase 2.x SDK,注释是来自 Jackson 的 JsonProperty

public class Arsenal {
    private int Cross;

    @JsonProperty("Cross")
    public int getCross() {
        return Cross;
    }
}

在 Firebase 3.x 中,对应的注解是PropertyName:

public class Arsenal {
    private int Cross;

    @PropertyName("Cross")
    public int getCross() {
        return Cross;
    }
}

【讨论】:

    【解决方案2】:

    如果你想得到 LongBall 的值,写这样的代码。

    Firebase.setAndroidContext(this);
     Firebase  myFirebaseRef= new Firebase("https://"https://xxxx.firebaseio.com/Cohesion/Passes/Away/Arsenal"/");
    
            myFirebaseRef.child("LongBall").addValueEventListener(new ValueEventListener() {
    
                @Override
                public void onDataChange(DataSnapshot snapshot) {
                    Log.e("TAG",snapshot.getValue().toString()); 
                }
    
                @Override public void onCancelled(FirebaseError error) { }
    
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多