Gamblers
Gamblers

Reputation: 31

Deserializing XML with nested fields to a single JavaObject

My goal is to convert the XML to JavaObject and have the JavaObject be able to handle one or more "Tasks".

I would also like to be able to convert the JavaObject to JSON as well.

How can this be done? At it's current state, I am able to convert if only one task exists, anymore results in an error.

I have an XML file that follows this structure:

<Plan>
    <ID></ID>
    <Comment></Comment>
    <CreateTime></CreateTime>
    <Task>...</Task>
    <Task>...</Task>
    <Task>...</Task>
</Plan>

Each Task element is structured like so:

    <Task>
      <Type></Type>
      <Time></Time>
      <Target>
         <Code></Code>
         <TargetId></TargetId>
         <Content>
            <Stuff1></Stuff1>
            <Stuff2></Stuff2>
            <Stuff3></Stuff3>
         </Content>
      </Target>
    </Task>

I am able to deserialize the XML when there is only one Task involved. Anymore gives me errors.

My Classes (simplified) are as follows:

@Root(name = "Plan")
public class Plan{
   @Element(name = "ID")
   private String id;
   
   @Element(name = "Comment")
   private String comment;

   @Element(name = "CreateTime")
   private String createTime;

   @Element(name = "Task")
   private Task task; 
}

@Root(name = "Task")
public class Task{

   @Element(name = "Type")
   private String type;
   
   @Element(name = "Time")
   private String time;

   @Element(name = "Target")
   private Target target;
}

@Root(name = "Target")
public class Target{

   @Element(name = "Code")
   private String code;
   
   @Element(name = "TargetId")
   private String targetId;

   @Element(name = "Content")
   private Content content;
}

@Root(name = "Content")
public class Content{

   @Element(name = "Stuff1")
   private String stuff1;
   
   @Element(name = "Stuff2")
   private String stuff2;

   @Element(name = "Stuff3")
   private String stuff3;
}

In the schema file, I set this but doesn't seem to work:

<xs:element name="Task" type="Task" minOccurs="1" maxOccurs="unbounded">

Upvotes: 0

Views: 282

Answers (1)

dariosicily
dariosicily

Reputation: 4547

At it's current state, I am able to convert if only one task exists, anymore results in an error.

This happens because your element annotation interprets the task tag as a property, so if there is more than one it raises an error. To avoid this behaviour you can use the JacksonXmlElementWrapper annotation you can apply to your task list:

public class Plan {

    @JacksonXmlProperty(localName = "Task")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<Task> tasks;
}

public class Task {}

This above is a starting basic example you can use to define more complicated xmls.

Upvotes: 1

Related Questions