Я использую Джексона для сериализации одного из моих классов как XML. Из-за сложной внутренней структуры я использую специальный сериализатор, который генерирует эти данные в виде массива.
Полученный XML выглядит так в упрощенном примере:
<MyDataType>
<list>
<entry>
<order>0</order>
<value>And then a step to the right</value>
</entry>
<entry>
<order>1</order>
<value>It's just a jump to the left</value>
</entry>
<entry>
<order>2</order>
<value>With your hands on your hips</value>
</entry>
</list>
</MyDataType>
Я только получить проблемы, когда я десериализую. Тогда jsonParser.getCodec().readTree(jsonParser)
просто «видит» последнюю запись массива. Все остальные записи потеряны.
Так что вывод отладки в десериализаторе покажет:
Deserialize: Incoming data:
{
"list": {
"entry": {
"order": "2",
"value": "With your hands on your hips"
}
}
}
Еще более странно: если я сериализую / десериализую в JSON, то тоже самое код работает отлично!
Десериализатор:
class MyDataTypeDeserialize extends JsonDeserializer<MyDataType> {
@Override
public MyDataType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
MyDataType result = new MyDataType();
JsonNode rootNode = jsonParser.getCodec().readTree(jsonParser);
// Shows only one entry when using XML
System.out.println("Deserialize: Incoming data: " + rootNode.toString());
JsonNode valueList = rootNode.get("list");
JsonNode entryList = valueList.findValue("entry");
for (Iterator<JsonNode> it = entryList.elements(); it.hasNext(); ) {
JsonNode element = it.next();
int order = element.get("order").asInt();
String value = element.get("value").asText();
result.addValue(order, value);
}
return result;
}
}
Любые намеки на то, что я делаю неправильно, будут оценены.