【问题标题】:Jackson JsonMappingException: Can not deserialize instanceJackson JsonMappingException:无法反序列化实例
【发布时间】:2014-07-12 04:25:53
【问题描述】:

我正在尝试使用 Jackson 将我的 json 数据转换为 POJO 对象。这是 MainActivity 和我的 POJO 类代码。我基本上收到了 JsonMappingException 错误。我还附上了整个日志。

MainActivity.java:

ObjectMapper mapper = new ObjectMapper();
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    try {
        List<Entries> results = mapper.readValue(new URL("http://collegewires.com/android/jacksoncw.json"), new TypeReference<List<Entries>>(){});
        for(int i=0;i<results.size();++i){
            System.out.println(results.get(i).getName());
            out = out + " ## " + results.get(i).getName();
            txt.setText("1111");
        }
    } catch (JsonParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (JsonMappingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Entries.java(这是 POJO)

package com.collegewires.jackson;

public class Entries {
public Entries(){
}

private String id, name, email, address, gender;
private Phone phone;

public Phone getPhone() {
    return phone;
}

public void setPhone(Phone phone) {
    this.phone = phone;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getGender() {
    return gender;
}

public void setGender(String gender) {
    this.gender = gender;
}

@Override
public String toString() {
    return "Entries:{id: " + id + ", name: " + name + 
                ", email: " + email + ", address: " + address + ", gender: " + gender + ", phone: " + phone + "}";
}

public class Phone {
    public Phone(){
    }
    public String  mobile, home, office;
    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    public String getHome() {
        return home;
    }

    public void setHome(String home) {
        this.home = home;
    }

    public String getOffice() {
        return office;
    }

    public void setOffice(String office) {
        this.office = office;
    }

    @Override
    public String toString() {
        return "Phone:{mobile: " + mobile + ", home: " + home + 
                    ", office: " + office + "}";
    }
}


}

现在,我的日志中出现以下错误。因此,我无法继续我的工作。这是日志:

07-12 12:06:13.206: W/System.err(30593): 

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
07-12 12:06:13.206: W/System.err(30593):  at [Source: http://collegewires.com/android/jacksoncw.json; line: 1, column: 1]
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:575)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:569)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:259)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:207)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
07-12 12:06:13.211: W/System.err(30593):    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2018)
07-12 12:06:13.211: W/System.err(30593):    at com.collegewires.jackson.MainActivity.onCreate(MainActivity.java:81)
07-12 12:06:13.211: W/System.err(30593):    at android.app.Activity.performCreate(Activity.java:5250)
07-12 12:06:13.211: W/System.err(30593):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
07-12 12:06:13.211: W/System.err(30593):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
07-12 12:06:13.211: W/System.err(30593):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
07-12 12:06:13.211: W/System.err(30593):    at android.app.ActivityThread.access$700(ActivityThread.java:152)
07-12 12:06:13.211: W/System.err(30593):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
07-12 12:06:13.211: W/System.err(30593):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-12 12:06:13.211: W/System.err(30593):    at android.os.Looper.loop(Looper.java:137)
07-12 12:06:13.211: W/System.err(30593):    at android.app.ActivityThread.main(ActivityThread.java:5328)
07-12 12:06:13.211: W/System.err(30593):    at java.lang.reflect.Method.invokeNative(Native Method)
07-12 12:06:13.211: W/System.err(30593):    at java.lang.reflect.Method.invoke(Method.java:511)
07-12 12:06:13.211: W/System.err(30593):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
07-12 12:06:13.211: W/System.err(30593):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
07-12 12:06:13.211: W/System.err(30593):    at dalvik.system.NativeStart.main(Native Method)
07-12 12:06:13.251: D/libEGL(30593): loaded /vendor/lib/egl/libEGL_POWERVR_SGX544_115.so
07-12 12:06:13.261: D/libEGL(30593): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX544_115.so
07-12 12:06:13.266: D/libEGL(30593): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX544_115.so
07-12 12:06:13.271: I/(30593): !@IMGSRV: DATE: 2013.04.23(11:19:33) | BUILDER: LSI3D | REVISION: e9cd1377d8225457ae40
07-12 12:06:13.346: D/OpenGLRenderer(30593): Enabling debug mode 0
07-12 12:06:31.521: W/IInputConnectionWrapper(30593): setComposingText on inactive InputConnection

【问题讨论】:

    标签: java android json jackson


    【解决方案1】:

    Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

    这里的关键词是ArrayListSTART_OBJECT token。您不能将单个对象反序列化为对象数组。试着理解这样做的意义,你就会明白为什么。

    您只能将 JSON 对象的 数组 反序列化为 POJO 的数组或集合。请注意,虽然 JSON 对象由 { } 大括号分隔,但数组由 [ ] 括号分隔,其中包含一些对象。

    【讨论】:

    • 嗨,非常感谢您的解释。您能否建议我的代码中所需的必要更改?对不起,我刚刚开始使用 JSON 和 jackson。此外,我无法编辑 JSON 文件,因为它托管在不属于我的远程服务器中。
    【解决方案2】:
    1. 删除 EntriesPhone

    2. 中的构造函数
    3. GetEntries results = mapper.readValue(new URL("http://collegewires.com/android/jacksoncw.json"), GetEntries.class);

    4. Entries 似乎是 JSON 中的一个参数。

    GetEntries.java

    package com.collegewires.jackson;
    
    import java.util.List;
    
    public class GetEntries{
        private List<Entries> entries;
    
        public List<Entries> getEntries(){
            return this.entries;
        }
        public void setEntries(List<Entries> entries){
            this.entries = entries;
        }
    }
    

    Entries.java

    package com.collegewires.jackson;
    
    import java.util.List;
    
    public class Entries{
        private String address;
        private String email;
        private String gender;
        private String id;
        private String name;
        private Phone phone;
    
        public String getAddress(){
            return this.address;
        }
        public void setAddress(String address){
            this.address = address;
        }
        public String getEmail(){
            return this.email;
        }
        public void setEmail(String email){
            this.email = email;
        }
        public String getGender(){
            return this.gender;
        }
        public void setGender(String gender){
            this.gender = gender;
        }
        public String getId(){
            return this.id;
        }
        public void setId(String id){
            this.id = id;
        }
        public String getName(){
            return this.name;
        }
        public void setName(String name){
            this.name = name;
        }
        public Phone getPhone(){
            return this.phone;
        }
        public void setPhone(Phone phone){
            this.phone = phone;
        }
    }
    

    Phone.java

    package com.collegewires.jackson;
    
    import java.util.List;
    
    public class Phone{
        private String home;
        private String mobile;
        private String office;
    
        public String getHome(){
            return this.home;
        }
        public void setHome(String home){
            this.home = home;
        }
        public String getMobile(){
            return this.mobile;
        }
        public void setMobile(String mobile){
            this.mobile = mobile;
        }
        public String getOffice(){
            return this.office;
        }
        public void setOffice(String office){
            this.office = office;
        }
    }
    

    【讨论】:

    • List results = mapper.readValue(new URL("collegewires.com/android/jacksoncw.json"), Entries.class); 给我错误 cannot convert from Entries to List
    • 嗨。这么晚才回复很抱歉。我不在。我根据上面建议的方式编辑了代码,但现在我收到以下行的错误: List results = mapper.readValue(new URL("collegewires.com/android/jacksoncw.json"), GetEntries.class); error : Type不匹配:无法从 GetEntries 转换为 List
    • @Azhar92 很抱歉回复很晚,我已经更新了答案,只是GetEntries 而不是List&lt;GetEntries&gt;
    【解决方案3】:

    json 的构造器意味着你在这样的对象中读回它:

    class Response{
     private List<Entries> entries = ....
    public setEntries(List<Entrie> e)
    public getEntries()....
    
    }
    

    像这样加载

     Response results = mapper.readValue(new URL("http://collegewires.com/android/jacksoncw.json"), Response.class);
    

    【讨论】:

      【解决方案4】:

      只需将数据放入[] 而不是{} 即可。

      例如:

      [
          {
              "id": "1",
              "name":"exemple"
          }
      ]
      

      【讨论】:

        猜你喜欢
        • 2016-07-09
        • 2015-01-04
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多