Разобрать xml-файл с несколькими элементами через jackson

У меня есть такой xml-файл:

<TABLES>
<TABLE NAME="abcd" TIME="2013.05.27 00:00:00" >
<LINES>
<LINE TIME="2013.05.27 00:00:00" BEGINE="787465" END="787465"/>
</LINES>
<SPECIAL>
<DAY MASK="128" DATE="16714778" />
<WEEK NAME="abcde" PARAM="128" />
</SPECIAL> 
</TABLE>
</TABLES>

Проблема в том, что внутри тега SPECIAL есть 2 типа элементов DAY и WEEK. Я не могу разобрать его через jackson, есть ли какой-то особый способ справиться с этим? Я могу без проблем разобрать остальные через POJO, но для особых случаев мне нужно настроить 2 разных класса

// DAY
class SPECIAL(
    @JacksonXmlProperty(localName = "MASK")
    val mask: String,

    @JacksonXmlProperty(localName = "DATE")
    val date: Int,
)

// WEEK
class SPECIAL(
    @JacksonXmlProperty(localName = "NAME")
    val name: String,

    @JacksonXmlProperty(localName = "PARAM")
    val param: Int,
)

person maxxxo    schedule 27.04.2020    source источник


Ответы (1)


Special имеет два разных тега DAY и Week, поэтому вы можете разделить их на два класса POJO, как

data class DAY(@JacksonXmlProperty(localName = "Date") val date: String, @JacksonXmlProperty(localName = "MASK")val mask: String)

data class WEEK(@JacksonXmlProperty(localName = "PARAM") val param: String,@JacksonXmlProperty(localName = "Name") val name: String)

и используйте их в СПЕЦИАЛЬНОМ классе как:

data class SPECIAL(@JacksonXmlProperty(localName = "WEEK") val week: WEEK, @JacksonXmlProperty(localName = "DAY") val day: DAY)



Чтобы сделать поле SPECIAL необязательным, отметьте это поле как обнуляемое в своем классе TABLE, используя ? как:

data class TABLE(
    @JacksonXmlProperty(localName = "SPECIAL") val special: SPECIAL?,
    @JacksonXmlProperty(localName = "NAME") val name: String,
    @JacksonXmlProperty(localName = "TIME") val time: String
)

и SPECIAL класс как

data class SPECIAL(
    @JacksonXmlProperty(localName = "WEEK") var week: WEEK?,
    @JacksonXmlProperty(localName = "DAY") var day: DAY?
)

Просмотреть полный исходный код

person Pavneet_Singh    schedule 29.04.2020
comment
ОК, мне понравилось, что предложенная неделя или день не являются обязательными, поэтому я сделал их необязательными, но затем у меня была ошибка Нераспознанное поле, не помеченное как игнорируемое. И когда я аннотировал класс с помощью @JsonIgnoreProperties (ignoreUnknown = true), синтаксический анализ завершен без ошибок, есть правильное количество СПЕЦИАЛЬНЫХ объектов, но во всех из них ДЕНЬ и НЕДЕЛЯ всегда равны нулю - person maxxxo; 30.04.2020
comment
@maxxxo @JsonIgnoreProperties(ignoreUnknown = true) позволит избежать сериализации и десериализации, поэтому лучше использовать @JsonInclude(Include.NON_NULL) для необязательных значений, а также использовать var с полями, допускающими значение NULL var day: DAY? = null . Хотя лучше упомянуть требование один раз или опубликовать другой вопрос. - person Pavneet_Singh; 30.04.2020
comment
Я пробовал включить аннотацию и опции, но не помогло, это ошибка: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Нераспознанное поле NAME (класс .Special), не помеченное как игнорируемое (4 известных свойства : ДЕНЬ, НЕДЕЛЯ, день, неделя]) в [Источник: (StringReader); строка: 26, столбец: 58] (через цепочку ссылок: ›.Table[SPECDAYS]-›java.util.ArrayList[0]-›*.SpecDay[NAME]) Основная проблема в том, что в Special Джексон ожидает свойства из дня/недели, а не дня/недели. Я также пытался установить isAttribute = true, но без изменений - person maxxxo; 04.05.2020
comment
Когда я скопировал параметры из Day и Week в Special, все заработало нормально. - person maxxxo; 04.05.2020