我正在尝试读取存储在我的 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: 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/