deserialize xml to pojo using jackson xml mapper

The name of the pictureThe name of the pictureThe name of the pictureClash 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();







The link just explains deserializ XML using Jackson. So it is not possible using annotations?
– Raghul Raman
Aug 12 at 16:21





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.

Popular posts from this blog

make 2 or more post in bootsrap

Store custom data using WC_Cart add_to_cart() method in Woocommerce 3

Firebase Auth - with Email and Password - Check user already registered