Jackson 2.8.9 @JsonPropertyOrder在排序XML时不排列由@JsonTypeInfo生成的字段

时间:2017-08-18 08:52:51

标签: java xml annotations jackson jackson-dataformat-xml

我正在尝试按以下格式序列化和反序列化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值而异吗?

提前致谢。

0 个答案:

没有答案