【问题标题】:Error com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input错误 com.fasterxml.jackson.databind.exc.MismatchedInputException:由于输入结束,没有要映射的内容
【发布时间】:2018-09-23 20:20:40
【问题描述】:

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

"{ \"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;
    }
}

另外,这个CustomObject里面还有一个对象:

public class Contact {

    private String name;
    private String phone;

    public Contact() {
    }

    public Contact(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

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

    public String getPhone() {
        return phone;
    }

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

现在,我正在尝试执行以下操作:

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]

【问题讨论】:

  • 你能试试这个吗:"[{\"name\":\"1\",\"phone\":\"+123456\"}]"
  • 抱歉,没用...

标签: java json string jackson objectmapper


【解决方案1】:

杰克逊很聪明,但没有那么聪明。

如果没有注释,在反序列化期间无法识别您的公共 setter setContactList。

你有两个选择:

  1. 用@JsonProperty("contacts")注释它
  2. 将其更改为setContacts

其他选择包括更改 JSON 或使实际字段可访问 - 不详细说明,因为它们很可能是错误的选择。

还可以考虑在其他地方修改您的代码,例如getContactList getter 如果您计划序列化 POJO 的实例。

【讨论】:

  • 或者将字段名称更改为contactList(这是最不可见的更改),但我认为#2是长期最好的——带get/set的字段最好命名为contacts来显示它是一个集合,而不是什么类型的集合 (List),尽管使用 JSON 反序列化了解预期类型可能比隐藏实现细节更有用。是的,这变得很复杂。
  • @KristianH 不幸的是,更改字段名称也意味着更改 JSON!
  • 嘿@mena,首先,感谢您的时间和回答。不幸的是,这并没有成功。仍然收到相同的错误:“无法构造com.ronikurtberg.Utils.CustomObject 的实例(尽管至少存在一个创建者):没有字符串参数构造函数/工厂方法可以从字符串值反序列化('{“contacts”:[{“name”:” 0","phone":"+123456"}]}') 在 [Source: (String)""{ \"contacts\": [{\"name\":\"0\",\"phone\ ":\"+123456\"}]}"";行:1,列:1]"。新二传手:public void setContacts(List&lt;Contact&gt; contacts) { this.contacts = contacts; }
  • 嗨@RoniKurtberg,我确实根据你的MCVE测试了我的答案(我也邀请你试试)。我怀疑可能有一些额外的代码你为了简洁而没有发布,这会以某种方式干扰这里 - 例如不确定MobileResponse 在做什么...
  • @RoniKurtberg 不,我已经从您的问题中复制粘贴了String 来测试我的代码。但是,如果您仔细观察,错误消息会有所不同,这表明您的代码的另一部分可能存在问题,可能是另一个有效负载。查看this SO 发布的关于您的新错误消息的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多