我正在尝试按以下格式序列化和反序列化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中生成重复的标记。
实现这一目标的正确方法是什么?或者还有其他更好的方法(使用content
序列化和反序列化提到的xml因具有特定顺序的command
值而异吗?
提前致谢。