Java - 无法反序列化 xml

Java - cant deserialize xml

无法解决这个问题。 这是我的 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;
}

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 文件的方法。 提前感谢您的帮助。

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

  1. 您正在尝试使用 <users> 标记(小写)解析 Users class。这将不起作用 除非 你用 @JacksonXmlRootElement(localName = "users")
  2. 注释 class
  3. String xmlContent = XMLReader(new FileInputStream(file)) 行中 我不知道 XMLReader 是什么(可能是错误命名的方法),无论如何你不需要将整个 xml 加载到一个字符串中在内存中,这是低效的,只需传递给 readValue() 你文件的输入流。
  4. 默认情况下,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 列表

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

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

这是解析文件的工作片段:

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);