deserialize xml to pojo using jackson xml mapper

Clash Royale CLAN TAG#URR8PPP
deserialize xml to pojo using jackson xml mapper
I am using Jackson XML mapper to deserialize XML to POJO. The XML looks like
<person>
<agency>
<phone>111-111-1111</phone>
</agency>
</person>
And my class looks like
class Person
@JacksonXmlProperty(localName="agency", namespace="namespace")
private Agency agency;
//getter and setter
class Agency
@JacksonXmlElementWrapper(useWrapping = false)
@JacksonXmlProperty(localName="phone", namespace="namespace")
private List<AgencyPhone> phones;
//getter and setter
class AgencyPhone
private Phone phone;
//getter and setter
class Phone
private String number;
//getter and setter
I want to set the phone number to number in Phone class. I cannot change XML or the way the class has been structured. I am getting Cannot construct instance of resolved.agency.AgencyPhone error and I created a AgencyPhone constructor
resolved.agency.AgencyPhone
class AgencyPhone{
private Phone phone;
public AgencyPhone(Phone phone)
this.phone = phone;
But that did not work. So how to deserialize to nested instances.
1 Answer
1
You can write your own custom deserialiser to achieve this. Here is the code to get you started:
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import java.io.IOException;
public class Test
public static void main(String args) throws JsonParseException, JsonMappingException, IOException
XmlMapper mapper = new XmlMapper();
final SimpleModule module = new SimpleModule("configModule", com.fasterxml.jackson.core.Version.unknownVersion());
module.addDeserializer(Person.class, new DeSerializer());
mapper.registerModule(module);
// Person readValue = mapper.readValue(<xml source>);
class DeSerializer extends StdDeserializer<Person>
protected DeSerializer()
super(Person.class);
@Override
public Person deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException
// use p.getText() and p.nextToken to navigate through the xml and construct Person object
return new Person();
No. Using annotations, you will have to create 'phone' as a List<String>. The link explains if in-built mechanism doesn't support your expectations, you can have your own custom mechanism.
– S.K.
Aug 13 at 4:40
Ok. Could you point me to custom deserializer. I could not find any example for xml custom deserializer, is it same as Json custom deserializer?
– Raghul Raman
Aug 13 at 4:44
edited the answer to include sample code.
– S.K.
Aug 13 at 5:25
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
The link just explains deserializ XML using Jackson. So it is not possible using annotations?
– Raghul Raman
Aug 12 at 16:21