android - 从 Firebase 读取数据时发生 UnrecognizedPropertyException

标签 android firebase firebase-realtime-database

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

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

Firebase database

现在,从 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: FATAL EXCEPTION: main Process: com.ihrd.myapplication, PID: 13585 Theme: themes:{} com.firebase.client.FirebaseException: Failed to bounce to type at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185) at com.ihrd.myapplication.MainActivity$1.onDataChange(MainActivity.java:28) at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:53) at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5461) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Cross" (class com.ihrd.myapplication.Arsenal), not marked as ignorable (0 known properties: ]) at [Source: java.io.StringReader@e1c14e3; line: 1, column: 12] (through reference chain: com.ihrd.myapplication.Arsenal["Cross"]) at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034) at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183) at com.ihrd.myapplication.MainActivity$1.onDataChange(MainActivity.java:28)  at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:53)  at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)  at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5461)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

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

最佳答案

当它找到带有 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 - 使用公共(public)字段而不是 getters/setters

如果您只有公共(public)字段,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;
    }
}

关于android - 从 Firebase 读取数据时发生 UnrecognizedPropertyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39566933/

相关文章:

Firebase webpack+babel 函数未部署

c# - 多个索引可供收藏 - 只有一个作品

android - 从 Google Play 但不是从 Android Studio 运行时出现 NullPointerException

android - 应用内结算库存价格并不总是与用户打算购买时显示的货币相同

android - 没有创建 Firebase App '[DEFAULT]' - 调用 Firebase.initializeApp() 仍然存在相同的错误

android - 我在哪里可以找到默认的 android xml 绘图?

javascript - firebase - Firebase当前用户未存储正确的用户

cordova - 我应该在Firebase Cloud Messaging中为授权 key 指定什么

javascript - 创建 Firebase 用户并同时将数据添加到数据库中

android - Android设备设置为AP时在wireshark上抓取手机流量