2

我正在尝试以以下格式序列化和反序列化 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特定顺序的值而变化)?

提前致谢。

4

0 回答 0