【问题标题】:(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('12')(尽管至少存在一个 Creator):没有字符串参数构造函数/工厂方法可以从字符串值('12')反序列化
【发布时间】:2020-11-11 15:44:04
【问题描述】:

以下方法 convertToObject 使用 Jackson 将 XML 转换为 Object。我收到以下错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.test.Student` 
(although at least one Creator exists):no String-argument constructor/factory method to deserialize from String value ('12')

以下是核心类:

    private Students convertToObject(String xml) {
    XmlMapper xmlMapper = new XmlMapper();
    Students matchedObjects = null;

    try {
         System.out.println(xml);
         matchedObjects = xmlMapper.readValue(xml, Students.class);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }

    System.out.println(matchedObjects);

    return matchedObjects;
}

这是输入 XML:

<students>
<student><id>12</id><surname>DOE</surname><givenName>JOHN</givenName><marks>98.928</marks></student>
<student><id>13</id><surname>PRICE</surname><givenName>MIKE</givenName><marks>90.8444</marks> </student>
</students>

这是两个 POJO:

@Getter @Setter @AllArgsConstructor @NoArgsConstructor @ToString
@JacksonXmlRootElement(localName = "student")
public class Student {
    String id;
    String givenName;
    String surname;
    String marks;
}

@Getter @Setter @AllArgsConstructor @NoArgsConstructor @ToString
@JacksonXmlRootElement(localName = "students")
public class Students {
    @JacksonXmlProperty(localName = "student")
    private List<Student> student;
}

这是pom文件中的依赖。

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.11.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.1</version>
    </dependency>

【问题讨论】:

    标签: java json xml jackson


    【解决方案1】:

    您不需要Students 包装类。将此XML 有效负载反序列化为List&lt;Student&gt;

    CollectionType studentsListType = xmlMapper.getTypeFactory().constructCollectionType(List.class, Student.class);
    List<Student> students = xmlMapper.readValue(xmlFile, studentsListType);
    

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2019-05-15
      • 2017-03-03
      • 2018-09-09
      • 1970-01-01
      • 2019-12-31
      • 2017-12-23
      • 2021-09-22
      • 2022-12-12
      相关资源
      最近更新 更多