I have the following xml. How do I convert into a java object using xstream. I tried sevral ways but I end up in getting conversionexception.
Code is below. I don't have any idea of how to convert to BookDetails
object.
XML string:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Books>
<bookdetails>
<bookId>20</bookId>
<bookName>AAAA</bookName>
<amount>35</amount>
</bookdetails>
</Books>
BookDetails class:
@XStreamAlias("bookDetails")
public class BookDetails {
@XStreamAlias("bookId")
private int bookId;
@XStreamAlias("bookName")
private String bookName;
@XStreamAlias("amount")
private int amount;
//getters and setters
}
Books class:
@XStreamAlias("Books")
public class Books{
@XStreamAlias("bookDetails")
private List<BookDetails> bookDetails=new ArrayList<BookDetails>();
}
--------------unmarshall class method----
public BookDetails convertXml(String xml){
xstream.processAnnotations(Books.class);
xstream.processAnnotations(BookDetails.class);
xstream.addImplicitCollection(Books.class,"BookDetails");
return (BookDetails)xstream.fromXML(processOrderXML);
}
There are several issues with your code.
First, you use wrong alias for BookDetails
class. You are declaring it as @XStreamAlias("bookDetails")
and your XML tag is all lowercase bookdetails
.
Then you are using wrong field name for defining implicit collection: it should be bookDetails
- as your list field name, and not BookDetails
.
And finally, you have to parse complete XML and then you can get your BookDetails
data from it. Instead of creating BookDetails
instance XStream
will give you Books
instance.
As additional observation, you don't have to add aliases for fields that have exact name as XML tags.
Corrected code would be:
@XStreamAlias("bookdetails")
public class BookDetails
{
private int bookId;
private String bookName;
private int amount;
}
@XStreamAlias("Books")
public class Books
{
private List<BookDetails> bookDetails = new ArrayList<BookDetails>();
}
public BookDetails convertXml(String xml)
{
xstream.processAnnotations(Books.class);
xstream.processAnnotations(BookDetails.class);
xstream.addImplicitCollection(Books.class, "bookDetails");
Books b = (Books) xstream.fromXML(xml);
// and now you can return your BookDetails element (in case you want only first one)
return b.bookDetails.get(0);
}