有人可以解释一下我做错了吗,下面我发布了我的代码
My Pasta Class
public class Pasta {
String Name;
String Desc;
String Price;
String Temp;
public Pasta() {
}
public Pasta(String name, String desc, String price, String temp) {
Name = name;
Desc = desc;
Price = price;
Temp = temp;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getDesc() {
return Desc;
}
public void setDesc(String desc) {
Desc = desc;
}
public String getPrice() {
return Price;
}
public void setPrice(String price) {
Price = price;
}
public String getTemp() {
return Temp;
}
public void setTemp(String temp) {
Temp = temp;
}
我的Java代码
Ref.child("Products").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Pasta List
for (DataSnapshot pasta : dataSnapshot.child("Pasta").getChildren()) {
Pasta p = pasta.getValue(Pasta.class);
ProductsFragment.pastaArrayList.add(p);//My Pasta ArrayList
Log.e("Pasta Object: ",p.getName());
}
异常
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pizzanpasta, PID: 5177
com.firebase.client.FirebaseException: Failed to bounce to type
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
at com.pizzanpasta.Handlers.FirebaseHandler$1.onDataChange(FirebaseHandler.java:74)
at com.firebase.client.Query$1.onDataChange(Query.java:158)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
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:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5300)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
at dalvik.system.NativeStart.main(Native Method)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Name" (class com.pizzanpasta.Models.Pasta), not marked as ignorable (4 known properties: , "desc", "price", "name", "temp"])
at [Source: java.io.StringReader@42e16a68; line: 1, column: 10] (through reference chain: com.pizzanpasta.Models.Pasta["Name"])
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:181)
at com.pizzanpasta.Handlers.FirebaseHandler$1.onDataChange(FirebaseHandler.java:74)
at com.firebase.client.Query$1.onDataChange(Query.java:158)
at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
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:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5300)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:830)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
at dalvik.system.NativeStart.main(Native Method)
如果我不把snapsnot投入课堂
for (DataSnapshot pasta : dataSnapshot.child("Pasta").getChildren()) {
Log.e("Pasta Node; ", pasta.toString());
}
即日志结果:
05-14 15:18:13.865 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Bolognese (Beef), value = {Name=Bolognese (Beef), Temp=temp, Desc=Bolognese Pasta with Red sause, Price=400} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Chicken La'Primavera, value = {Name=Chicken La'Primavera, Temp=temp, Desc=Backed Chicken La'Primavera Pasta, Price=400} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Lasagne, value = {Name=Lasagne, Temp=temp, Desc=Backed Lasagne Pasta, Price=300} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Marinara, value = {Name=Marinara, Temp=temp, Desc=Marinara Pasta with Red sause, Price=400} }
在日志结果中,您可以看到它就像Pasta Class,但我无法将其转换为Pasta Class Object
答案 0 :(得分:3)
由于您的setter方法名为setName(…)
,因为Java命名约定,Jackson假定变量名为name
。
这是你问题的原因。
解决此问题的最佳方法应该是在Firebase数据库中使用“desc”,“price”,“name”,“temp”。
否则您可以使用@JsonProperty注释,如下所示:
@JsonProperty("Name")
public void setName(String n) {
// ...
}
答案 1 :(得分:1)
@ Gabriele的回答将起作用。两种选择:
在当前设置中,Firebase无法将JSON属性映射到Java对象,因为它所期望的外壳不匹配。如果您有方法getName()
,则JSON中的预期属性为name
。您的JSON使用Name
。
要使用当前代码,您可以将JSON修改为:
{
name: "Bolognese (Beef)",
temp: "temp",
desc: "Bolognese Pasta with Red sause",
price: 400
}
使用这些属性名称,Firebase将能够在您的Java类中找到正确的字段/ setter。
您还可以将字段声明为公共字段,并且不使用getter / setter:
public class Pasta {
public String Name;
public String Desc;
public String Price;
public String Temp;
public Pasta() {
}
public Pasta(String name, String desc, String price, String temp) {
Name = name;
Desc = desc;
Price = price;
Temp = temp;
}
}
现在Firebase将找到与JSON属性同名的公共字段,因此它可以正确映射它们。