Джексон XML десериализация XML в POJO со 2-го уровня - PullRequest
0 голосов
/ 09 сентября 2018

Надеюсь, это не слишком сложный вопрос. Я пытаюсь десериализовать XML в POJO со 2-го уровня XML, но после поиска и пробования многих ответов на другие вопросы, подобные этому, я все еще пытаюсь найти что-то для этого уровня.

XML (который предоставляется, и я не могу изменить его), похож на этот

<?xml version="1.0" encoding="UTF-8"?>
<ns0:InputRequest xmlns:ns0="OW">
    <ns0:FMan>
        <ns0:CInc>
            <ns0:Act>Sample</ns0:Act>
            <ns0:Op>Sample</ns0:Op>
            <ns0:Int>AppInt</ns0:Int>
        </ns0:CInc>
    </ns0:FMan>
</ns0:InputRequest>

Мне нужно только десериализовать CInc (будет только когда-либо один) в мой POJO, который выглядит как

public class CInc extends InputRequest {

    @JacksonXmlProperty(namespace = "ns0", localName = "Act")
    private String action;

    @JacksonXmlProperty(namespace = "ns0", localName = "Op")
    private String operation;

    @JacksonXmlProperty(namespace = "ns0", localName = "Int")
    private String intName;

    // Usual Getters, Setters, etc

}

Я расширяю абстрактный класс верхнего уровня следующим образом

@JacksonXmlRootElement(namespace = "ns0", localName = "InputRequest")
public class InputRequest { }

МОЙ Java-код похож на

XmlMapper xmlMapper = new XmlMapper();
CInc cInc = xmlMapper.readValue(content, CInc.class);

Сбой из-за отсутствия элемента FMan.

Из другого ответа я попытался отключить FAIL_ON_UNKNOWN_PROPERTIES, как это

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
CInc cInc = xmlMapper.readValue(content, CInc.class);

Это устраняет ошибку, но все значения в POJO равны нулю.

Я также попытался поместить другой абстрактный класс для элемента 'FMan', который расширяет 'InputRequest', а затем изменил CInc для расширения FMan, т.е.

public class FMan extends InputRequest {
...

и

public class CInc extends FMan {
...

Но это совсем не помогает. Я чувствую, что ответ - это что-то глупое, что мне не хватает, но я действительно изо всех сил пытаюсь получить ответ на этот вопрос, поэтому любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Вы можете сделать это с SimpleXml. Добавьте это POJO;

@XmlName("ns0:CInc")
public class Cinc {
    @XmlName("ns0:Act")
    public String act;
    @XmlName("ns0:Op")
    public String op;
    @XmlName("ns0:Int")
    public String Int;
}

Далее код для десериализации и вывода на печать:

public static void main(final String... args) throws InvalidXPath, IOException {
    final SimpleXml simple = new SimpleXml();
    final Cinc c = simple.fromXml(xml, "ns0:InputRequest/ns0:FMan/ns0:CInc", Cinc.class);
    System.out.println(c.act + " - " + c.op + " - " + c.Int);
}

Будет напечатано:

Sample - Sample - AppInt

SimpleXml находится в Maven Central:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>2.0.0</version>
</dependency>
0 голосов
/ 09 сентября 2018

Я знаю, что он использовал Джексона, должен быть сериализован, другими словами, расширить сериализацию и иметь частное свойство идентификатора последовательной версии, то же самое относится и к Суперклассу.

 public class CInc extends InputRequest,serialize {
    private final long serialVersionUID = 1L;
    *****
}
...