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