Java 错误com.fasterxml.jackson.databind.exc.MismatchedInputException:由于输入结束,没有要映射的内容

Java 错误com.fasterxml.jackson.databind.exc.MismatchedInputException:由于输入结束,没有要映射的内容,java,json,string,jackson,objectmapper,Java,Json,String,Jackson,Objectmapper,我正在尝试转换下一个字符串: "{ \"contacts\": [{\"name\":\"1\",\"phone\":\"+123456\"}]}" 对于某些自定义对象: public class CustomObject{ private List<Contact> contacts; public CustomObject(){ } public CustomObject(List<Contact> contacts) {

我正在尝试转换下一个字符串:

"{ \"contacts\": [{\"name\":\"1\",\"phone\":\"+123456\"}]}"
对于某些自定义对象:

public class CustomObject{

    private List<Contact> contacts;

    public CustomObject(){

    }

    public CustomObject(List<Contact> contacts) {
        this.contacts = contacts;
    }

    public List<Contact> getContactList() {
        return contacts;
    }

    public void setContactList(List<Contact> contacts) {
        this.contacts = contacts;
    }
}
现在,我正努力做到以下几点:

private List<Contact> parseString(String jsonAsString) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    CustomObject customObject = mapper.readValue(jsonAsString, CustomObject .class);
    return customObject .getContactList();
}

杰克逊很聪明,但并不聪明

在没有注释的反序列化过程中,无法识别您的公共setter
setContactList

你有两个选择:

  • @JsonProperty(“联系人”)
  • 将其更改为
    setContacts
  • 其他选择包括更改JSON或使实际字段可访问-不详细说明,因为它们很可能是错误的选择


    还考虑在其他地方修改您的代码,例如,如果您计划序列化POJO的实例,请使用<代码> GETCONTACTABLIST/<代码> GETTER。

    杰克逊是聪明的,但不是<强> < <强> >聪明。 在没有注释的反序列化过程中,无法识别您的公共setter

    setContactList

    你有两个选择:

  • @JsonProperty(“联系人”)
  • 将其更改为
    setContacts
  • 其他选择包括更改JSON或使实际字段可访问-不详细说明,因为它们很可能是错误的选择


    也可以考虑在其他地方修改您的代码,例如,如果您打算序列化POJO的实例,请尝试:<代码> > [ {“1”\“\”\“\”\“+ 123456”} ]“< /代码>对不起,但它不起作用……您能试试这个吗?<代码>”[{“name \”:\“1”,\“电话\”:\“123456”} ]“< /代码>对不起,但它不起作用…或者将字段名更改为contactList(这是最不明显的更改),但我认为#2从长远来看是最好的-字段w/get/set是命名最好的contacts,以显示它是一个集合,而不是什么样的集合(List),尽管对于JSON反序列化,了解预期类型可能比隐藏实现细节更有用。是的,这很复杂。@KristianH不幸地更改字段名也意味着更改JSON!嘿@mena,首先,谢谢你的时间和回答。不幸的是,这没有成功。仍然收到相同的错误:“无法构造
    com.ronikurtberg.Utils.CustomObject
    (尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从[Source:“{”contacts:[{”name:“0”,“phone:“+123456”}”)的[Source:“{”contacts\:[{”name\:“0\”,“phone\:”处的字符串值反序列化+123456 \“}]}”;行:1,列:1]”。新的setter:
    public void setContacts(List contacts){this.contacts=contacts;}
    Hi@RoniKurtberg,我确实用你的MCVE测试了我的答案(我也邀请你试试)。我怀疑可能还有一些你为了简洁而没有发布的代码在这里产生了干扰-例如,不确定
    MobileResponse
    在做什么…@RoniKurtberg nah,我已经从你的问题中复制粘贴了
    字符串来测试我的代码。但是,如果仔细观察,错误消息是不同的,这表明您可能在代码的另一部分遇到问题,可能是另一个负载。看看SO post关于您的新错误消息。或者将字段名更改为contactList(这是最不明显的更改),但我认为#2从长远来看是最好的-字段w/get/set是最有名的contacts,以显示它是一个集合,而不是什么类型的集合(List),尽管对于JSON反序列化,了解预期类型可能比隐藏实现细节更有用。是的,这很复杂。@KristianH不幸地更改字段名也意味着更改JSON!嘿@mena,首先,谢谢你的时间和回答。不幸的是,这没有成功。仍然收到相同的错误:“无法构造
    com.ronikurtberg.Utils.CustomObject
    (尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法从[Source:“{”contacts:[{”name:“0”,“phone:“+123456”}”)的[Source:“{”contacts\:[{”name\:“0\”,“phone\:”处的字符串值反序列化+123456 \“}]}”;行:1,列:1]”。新的setter:
    public void setContacts(List contacts){this.contacts=contacts;}
    Hi@RoniKurtberg,我确实用你的MCVE测试了我的答案(我也邀请你试试)。我怀疑可能还有一些你为了简洁而没有发布的代码在这里产生了干扰-例如,不确定
    MobileResponse
    在做什么…@RoniKurtberg nah,我已经从你的问题中复制粘贴了
    字符串来测试我的代码。但是,如果仔细观察,错误消息是不同的,这表明您可能在代码的另一部分遇到问题,可能是另一个负载。看一看关于新错误消息的SO post。
    
    private List<Contact> parseString(String jsonAsString) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        CustomObject customObject = mapper.readValue(jsonAsString, CustomObject .class);
        return customObject .getContactList();
    }
    
    com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input
     at [Source: (String)""{ \"contacts\": [{\"name\":\"1\",\"phone\":\"+972545519713\"}]}""; line: 1, column: 1]