Идентичный вложенный тег XML с Джексоном - PullRequest
0 голосов
/ 16 октября 2018

Я анализирую следующий внешний XML с Джексоном.

<SomeRootObject>
  <Events>
    <Event>
      <EventID>248739296</EventID>
      ...
      <Event>1709</Event>
      ...

Я определил POJO для «Событие».

@JacksonXmlRootElement(localName = "Event")
public class MyEvent {
    @JsonProperty("EventID")
    public String eventID;

    ...

    @JsonProperty("Event")
    public int event;

    ...

Как вы можете видеть, одно из полей в этом POJO также отображается как «Событие».И поэтому Джексон жалуется, что он не может создать int из события:

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of int out of START_OBJECT token
at [Source: java.io.StringReader@12417468; line: 1, column: 280] (through reference chain: be.parkd.api.tnt.ram.model.RamEvents[“Event”]->java.util.ArrayList[0]->be.parkd.api.tnt.ram.model.RamEvent[“Event”]).

Может ли этот случай быть обработан с Джексоном?

У меня есть одно грязное исправлениеИмеется в виду предварительная обработка XML для изменения основного события, но я бы предпочел более чистое решение.

1 Ответ

0 голосов
/ 16 октября 2018

Вариант 1

В следующем примере читается список элементов <Event>, заключенных в элемент <Events>.Сам <Event> содержит еще один вложенный элемент <Event>.Кажется, это не проблема для Джексона .

Примечание : я использовал TypeReference<List<Event>>() {} в качестве правила сериализации.

@Test
public void test1() throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new XmlMapper();
    List<Event> event=mapper.readValue("<Events><Event><EventID>248739296</EventID><Event>1709</Event></Event><Event><EventID>248739297</EventID><Event>1710</Event></Event></Events>", new TypeReference<List<Event>>() {
    });
    System.out.println(toString(event));
}

public String toString(Object obj) {
    try {
        StringWriter w = new StringWriter();
        new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, obj);
        return w.toString();
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

С Event.java

@JacksonXmlRootElement(localName = "Event")
public class Event {
    @JsonProperty("EventID")
    private String eventID;
    @JsonProperty("Event")
    private int event;
    public String getEventID() {
        return eventID;
    }
    public void setEventID(String eventID) {
        this.eventID = eventID;
    }
    public int getEvent() {
        return event;
    }
    public void setEvent(int event) {
        this.event = event;
    }
}

Печать

[ {
  "EventID" : "248739296",
  "Event" : 1709
}, {
  "EventID" : "248739297",
  "Event" : 1710
 } ]

Итак, это работает!

Вариант 2

@Test
public void test2() throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper mapper = new XmlMapper();
    SomeRootObject object=mapper.readValue("<SomeRootObject><Events><Event><EventID>248739296</EventID><Event>1709</Event></Event><Event><EventID>248739297</EventID><Event>1710</Event></Event></Events></SomeRootObject>", SomeRootObject.class);
    System.out.println(toString(object));
}

С SomeRootObject.class

@JacksonXmlRootElement(localName = "SomeRootObject")
public class SomeRootObject {
    @JsonProperty("Events")
    List<Event> events;
    public SomeRootObject() {

    }
    public List<Event> getEvents() {
        return events;
    }
    public void setEvents(List<Event> events) {
        this.events = events;
    }
}

Отпечатки

{
  "Events" : [ {
    "EventID" : "248739296",
    "Event" : 1709
  }, {
    "EventID" : "248739297",
    "Event" : 1710
  } ]
}

Работает тоже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...