【问题标题】:JsonMappingException: Can not instantiate value of type from Integral number; no single-int-arg constructor/factory methodJsonMappingException:无法从整数中实例化类型的值;没有单整数参数构造函数/工厂方法
【发布时间】:2016-02-06 09:00:17
【问题描述】:

我正在尝试查询我在 Firebase 上的 JSON 树中的一些数据。我继续创建我的 POJO,但我不断收到 JsonMappingException: Can not instantiate value of type [simple type, class net.rmoreno.ally.Ally] from Integral number; no single-int-arg constructor/factory method 错误。我已经做到了,它只考虑了String email,但它一直在崩溃并告诉我问题出在整数上。我该如何解决这个问题。

这是导致它崩溃的代码

query.addChildEventListener(new ChildEventListener() {

       ArrayList<Ally> allyArrayList = new ArrayList<>();

       @Override
       public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            for(DataSnapshot userSnapshot: dataSnapshot.getChildren()){
                Ally information = userSnapshot.getValue(Ally.class);
                allyArrayList.add(information);

      }
}

这是我的 POJO

@JsonIgnoreProperties({"latitude", "longitude","phone","availability","email"})
public class Ally {

    String name;
    //String email;
    //String phone;
    //int availability;

    public Ally(){

    }

    public String getName(){
        return name;
    }

//    public String getEmail(){
//        return email;
//    }

//    public String getPhone(){
//        return phone;
//    }

//    public int getAvailability(){
//        return availability;
//    }
}

这是我的堆栈跟踪

 com.firebase.client.FirebaseException: Failed to bounce to type
            at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185)
            at net.rmoreno.ally.MainActivity$1.onChildAdded(MainActivity.java:46)
            at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:58)
            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:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
     Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class net.rmoreno.ally.Ally] from Integral number; no single-int-arg constructor/factory method
            at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromInt(StdValueInstantiator.java:320)
            at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromNumber(BeanDeserializerBase.java:1012)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:138)
            at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
            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 net.rmoreno.ally.MainActivity$1.onChildAdded(MainActivity.java:46)
            at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:58)
            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:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

编辑:这是 Firebase 上的 JSON 结构

【问题讨论】:

  • 你能告诉我们你试图解析的 JSON 吗?
  • 我已经添加了它

标签: java android firebase


【解决方案1】:

在您的 JSON 中,您有一个数组,其余字段(如 availabilityemailname 等)都存在于该数组中。

在 Ally 类中,您尝试直接解析这些内部对象。

你应该做的是如下:

这是 Inner-Object 类:

@JsonIgnoreProperties({"latitude", "longitude","phone","availability","email"})
public class ArrayObject {

    private String name;
    private String email;
    private String phone;
    private int availability;

    public ArrayObject() {}

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public String getPhone() {
        return phone;
    }

    public int getAvailability() {
        return availability;
    }
}

这是Ally类:

public class Ally {
    private ArrayObject arrObj;

    /* Getter-Setters */

    public Ally() {}
}

【讨论】:

  • 我将如何在活动中提取 for loop 中的值?
  • 当您在做Ally information = userSnapshot.getValue(Ally.class); 时,您将获得包含数组对象的Ally 类的对象。您可以提取 allyObject.getArrObj().getName() 等值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 2018-02-12
  • 2014-07-20
  • 2012-09-29
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
相关资源
最近更新 更多