[英]Identical nested XML tag with Jackson
我正在使用Jackson解析以下外部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
以下示例读取包含在<Events>
元素中的<Event>
元素的列表。 <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
} ]
}
也工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.