【问题标题】:Java - cant deserialize xmlJava - 无法反序列化 xml
【发布时间】:2022-02-03 23:25:44
【问题描述】:

对此我无法理解。 这是我的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user>
        <username>Tom</username>
        <password>123</password>
    </user>
    <user>
        <username>Moc</username>
        <password>1234</password>
    </user>
</users>

这些是我的 Java 类:

Users.java

@Data
public class Users {
    private List<User> user;
}

用户.java

@Data
public class User {
    private String username;
    private String password;
}

由于某种原因,我经常遇到错误: “com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“用户”

我的加载方法在这里:

            ClassLoader classLoader = getClass().getClassLoader();
            File file = new File(classLoader.getResource("Users.xml").getFile());
            String xmlContent = XMLReader(new FileInputStream(file));
            XmlMapper xmlMapper = new XmlMapper();
            Users users = xmlMapper.readValue(xmlContent, Users.class);

XMLReader 只是逐行读取 xml 文件的方法。 提前感谢您的帮助。

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    您的代码中存在一些问题:

    1. 您正在尝试使用&lt;users&gt; 标签(小写)解析Users 类。这将不起作用除非你用@JacksonXmlRootElement(localName = "users")注释类
    2. String xmlContent = XMLReader(new FileInputStream(file))这一行我不知道XMLReader是什么(可能是一个错误命名的方法),反正你不需要把你的整个xml加载到内存中的一个字符串中,这样效率低下,直接传给readValue()你文件的输入流。
    3. 默认情况下,Jackson 会尝试为列表创建一个包装器元素,因此它希望您的 xml 具有以下结构:
    <users>
      <user>   <--- this is the list element wrapper
        <user>   <--- this is the actual "user"
          <username>
          <password>
        </user>
      </user>
    </users>
    

    如果你想避免包装,你必须用@JacksonXmlElementWrapper(useWrapping = false)注释user列表

    下面是 Users 类的工作示例,适用于您的 xml 示例

    @JacksonXmlRootElement(localName = "users")
    @Data
    public class Users {
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<User> user;
    }
    

    这是一个有效的 sn-p 来解析文件:

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("Users.xml").getFile());
    XmlMapper xmlMapper = new XmlMapper();
    Users users = xmlMapper.readValue(new FileInputStream(file), Users.class);
    

    【讨论】:

    • 感谢您的简短解释。我尝试使用您的代码,但现在我得到了这个:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "username" (class com.pai.project.paiProject.bootstrap.User),未标记为可忽略(0已知属性:]) 在 [Source: (FileInputStream); line: 4, column: 33](通过引用链:com.pai.project.paiProject.bootstrap.Users["user"]->java.util.ArrayList[0]->com.pai.project.paiProject.bootstrap .User["用户名"])
    • 您确定 Lombok 工作正常吗?尝试为 User 类中的“用户名”和“密码”字段手动添加 getter 和 setter,并去掉 @Data 注释
    • 看来你是对的。我很困惑,因为有时它在前一段时间工作正常,现在 intellijj 正在跟我开玩笑。无论如何,非常感谢。
    • 我非常讨厌龙目岛,但我知道它现在很受欢迎......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2015-09-24
    相关资源
    最近更新 更多