我正在尝试以以下格式序列化和反序列化 XML:
<home>
<handle>300023</handle>
<command>login</command>
<content>
<user_id>300023</user_id>
<result>0</result>
</content>
</home>
并尝试将其映射到以下类:
@Data
@JacksonXmlRootElement(localName = "home")
@JsonPropertyOrder({"handle", "command", "content"})
public class Home {
private long handle;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
visible = true,
property = "command")
@JsonSubTypes({
@JsonSubTypes.Type(value = LoginContent.class, name = "login")
})
private BaseContent content;
}
和
@Data
@JsonPropertyOrder({
"user_id",
"result"})
public class LoginContent implements BaseContent{
@JacksonXmlProperty(localName = "user_id")
private long userId;
private int result;
}
当我序列化时出现问题
Home home = new Home();
home.setHandle(300023);
LoginContent content = new LoginContent();
content.setUserId(300023);
content.setResult(0);
home.setContent(content);
XmlMapper xmlMapper = new XmlMapper();
xmlMapper.findAndRegisterModules();
String xmlString = xmlMapper.writeValueAsString(home);
xmlString 返回为具有正确字段但顺序不正确的 xml,为 @JsonPropertyOrder
<home>
<handle>300023</handle>
<content>
<user_id>300023</user_id>
<result>0</result>
</content>
<command>login</command>
</home>
的实现类类型content
基于 的值<command>
,它与 处于同一级别<content>
,因此使用JsonTypeInfo.As.EXTERNAL_PROPERTY
。由于反序列化按预期工作,我排除了 BaseContent 的其他实现类。现在我正在寻找一种方法,可以@JsonPropertyOrder
有效地处理由@JsonTypeInfo
. 我试图在 中添加command
字段Home.class
,但它会导致 xml 中出现重复的标签。
实现这一目标的正确方法是什么?还是有其他更好的方法(序列化和反序列化提到的 xml 并content
根据command
特定顺序的值而变化)?
提前致谢。