Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deserialize nested object in java SimpleXML

I have the following xml and i want to parse it with simpleXML.

<programme start="20161107190000 GMT+04:00" stop="20161107200000 GMT+04:00" channel="001">
    <title lang="en_GB">Foo</title>
    <desc lang="en_GB">Foobarbaz</desc>
</programme>
<programme start="20161107200000 GMT+04:00" stop="20161107203000 GMT+04:00" channel="001">
    <title lang="en_GB">JLS</title>
    <desc lang="en_GB">The Java Language Specification</desc>
</programme>

having the following

@Root
public class Programme {

    @Attribute(name = "channel", required = false)
    private String channel;

    @Attribute(name = "start", required = false)
    private String start;

    @Attribute(name = "stop", required = false)
    private String stop;

    @Element(name = "title", required = false)
    private Title title;

    @Element(name = "desc", required = false)
    private String desc;

    public Programme(String channel, String start, String stop, String title, String desc) {
        this.channel = channel;
        this.start = start;
        this.stop = stop;
        this.title = title;
        this.desc = desc;
    }

    public String getChannel() {
        return channel;
    }

    public void setChannel(String channel) {
        this.channel = channel;
    }

    public String getStart() {
        return start;
    }

    public void setStart(String start) {
        this.start = start;
    }

    public String getStop() {
        return stop;
    }

    public void setStop(String stop) {
        this.stop = stop;
    }

    public Title getTitle() {
        return title;
    }

    public void setTitle(Title title) {
        this.title = title;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Root(name = "title")
    public class Title {

        @Attribute
        private String lang;

        private String text;

        public Title(String lang, String text) {
            this.lang = lang;
            this.text = text;
        }

        public String getLang() {
            return lang;
        }

        public void setLang(String lang) {
            this.lang = lang;
        }

        @Text
        public String getText() {
            return text;
        }

        @Text
        public void setText(String text) {
            this.text = text;
        }
    }

}

gives me the error org.simpleframework.xml.core.ConstructorException: Can not construct inner class.

like image 823
Mr. Crowley Avatar asked Mar 13 '26 14:03

Mr. Crowley


1 Answers

There are couple of things to be careful about.

1) if you have nested class for Attributes in inner Elements the nested class must be static.

2) defining variable for inner class must annotate as follows

@Element(name = "title", type = Title.class, required = false)
private Title title;

3) inside constructor they should instantiate an empty class

this.title = new Title();

This is a full working version:

@Root
public class Programme {


    @Attribute(name = "channel", required = false)
    private final String channel;

    @Attribute(name = "start", required = false)
    private final String start;

    @Attribute(name = "stop", required = false)
    private final String stop;


    @Element(name = "title", type = Title.class, required = false)
    private Title title;

    @Element(name = "desc", type = Desc.class, required = false)
    private Desc desc;

    public Programme(
            @Attribute(name = "channel") String channel,
            @Attribute(name = "start") String start,
            @Attribute(name = "stop") String stop
    ) {
        this.channel = channel;
        this.start = start;
        this.stop = stop;
        this.title = new Title();
        this.desc = new Desc();
    }

    public Title getTitle() {
        return title;
    }

    public void setTitle(Title title) {
        this.title = title;
    }

    public Desc getDesc() {
        return desc;
    }

    public void setDesc(Desc desc) {
        this.desc = desc;
    }


    @Root(name = "title")
    public static class Title {
        public String text;
        @Attribute(name = "lang")
        private String lang;

        @Text
        public String getText() {
            return text;
        }

        @Text
        public void setText(String text) {
            this.text = text;
        }

        public String getLang() {
            return lang;
        }
    }

    @Root(name = "desc")
    public static class Desc {
        public String text;
        @Attribute(name = "lang")
        private String lang;

        @Text
        public String getText() {
            return text;
        }

        @Text
        public void setText(String text) {
            this.text = text;
        }

        public String getLang() {
            return lang;
        }
    }

}
like image 128
Mr. Crowley Avatar answered Mar 16 '26 04:03

Mr. Crowley



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!