<dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.10.1</version> </dependency> </dependencies>
package mtitek.jackson.marshalling.utils; import java.io.IOException; import java.io.InputStream; import org.apache.commons.io.IOUtils; public class ResourceUtils { private ResourceUtils() { } public static InputStream getResourceAsStream(final String fileName) { return Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); } public static String getResourceAsString(final String fileName) throws IOException { try (final InputStream inputStream = ResourceUtils.getResourceAsStream(fileName)) { return IOUtils.toString(inputStream, "UTF-8"); } } }
package mtitek.jackson.marshalling.jaxb.payload; import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "payload") @XmlType(name = "payload", propOrder = { "id", "code", "parameters" }) @XmlAccessorType(XmlAccessType.FIELD) public class Payload { @XmlElement(name = "id", required = true) private String id; @XmlElement(name = "code", required = true) private String code; @XmlTransient private String desc; @XmlElementWrapper(name = "parameters") @XmlElement(name = "parameter") private final List<PayloadParameter> parameters = new ArrayList<>(); public String getId() { return id; } public void setId(String value) { this.id = value; } public String getCode() { return code; } public void setCode(String value) { this.code = value; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public List<PayloadParameter> getParameters() { List<PayloadParameter> copyParameters = new ArrayList<PayloadParameter>(); copyParameters.addAll(this.parameters); return copyParameters; } public void setParameters(final List<PayloadParameter> parameters) { this.parameters.clear(); if (parameters != null) { this.parameters.addAll(parameters); } } @Override public String toString() { return "Payload [id=" + id + ", code=" + code + "]"; } }
package mtitek.jackson.marshalling.jaxb.payload; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; @XmlRootElement(name = "parameter") @XmlType(name = "parameterType", propOrder = { "name", "value" }) @XmlAccessorType(XmlAccessType.FIELD) public class PayloadParameter { @XmlAttribute(name = "id", required = true) private String id; @XmlElement(name = "name", required = true) private String name; @XmlElement(name = "value", required = true) private String value; public String getId() { return id; } public void setId(String value) { this.id = value; } public String getName() { return name; } public void setName(String value) { this.name = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "PayloadParameter [id=" + id + ", name=" + name + ", value=" + value + "]"; } }
@javax.xml.bind.annotation.XmlSchema(namespace = "http://marshalling.jackson.mtitek/payload", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package mtitek.jackson.marshalling.jaxb.payload;
package mtitek.jackson.marshalling.payload; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; @JacksonXmlRootElement(namespace = "http://marshalling.jackson.mtitek/payload", localName = "payload") @JsonPropertyOrder({ "id", "code" }) public class Payload { @JsonProperty("id") @JacksonXmlProperty(isAttribute = false, localName = "id", namespace = "") private String id; @JsonProperty("code") @JacksonXmlProperty(isAttribute = false, localName = "code", namespace = "") private String code; @JsonProperty("label") @JacksonXmlProperty(isAttribute = false, localName = "label", namespace = "") @JacksonXmlCData private String label; @JsonIgnore private String desc; @JacksonXmlElementWrapper(localName = "parameters") @JsonProperty("parameter") private final List<PayloadParameter> parameters = new ArrayList<>(); public String getId() { return id; } public void setId(String value) { this.id = value; } public String getCode() { return code; } public void setCode(String value) { this.code = value; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public List<PayloadParameter> getParameters() { List<PayloadParameter> copyParameters = new ArrayList<PayloadParameter>(); copyParameters.addAll(this.parameters); return copyParameters; } public void setParameters(final List<PayloadParameter> parameters) { this.parameters.clear(); if (parameters != null) { this.parameters.addAll(parameters); } } @Override public String toString() { return "Payload [id=" + id + ", code=" + code + ", label=" + label + "]"; } }
package mtitek.jackson.marshalling.payload; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; @JacksonXmlRootElement(localName = "parameter") @JsonPropertyOrder({ "name", "value" }) public class PayloadParameter { @JsonProperty("id") @JacksonXmlProperty(isAttribute = true, localName = "id", namespace = "") private String id; @JsonProperty("name") @JacksonXmlProperty(isAttribute = false, localName = "name", namespace = "") private String name; @JsonProperty("value") @JacksonXmlProperty(isAttribute = false, localName = "value", namespace = "") private String value; public String getId() { return id; } public void setId(String value) { this.id = value; } public String getName() { return name; } public void setName(String value) { this.name = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "PayloadParameter [id=" + id + ", name=" + name + ", value=" + value + "]"; } }
<?xml version="1.0" encoding="UTF-8"?> <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://marshalling.jackson.mtitek/payload" xmlns="http://marshalling.jackson.mtitek/payload" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"> <xs:element name="payload"> <xs:complexType> <xs:sequence> <xs:element name="id" type="xs:string" /> <xs:element name="code" type="xs:string" /> <xs:element name="parameters" type="parametersType" minOccurs="0" maxOccurs="1" /> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="parametersType"> <xs:sequence> <xs:element name="parameter" type="parameterType" minOccurs="1" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> <xs:complexType name="parameterType"> <xs:all> <xs:element name="name" type="xs:string" /> <xs:element name="value" type="xs:string" /> </xs:all> <xs:attribute name="id" type="xs:string" /> </xs:complexType> </xs:schema>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <payload> <id>123</id> <code>xyz</code> <parameters> <parameter id="11"> <name>bar</name> <value>foo</value> </parameter> <parameter id="22"> <value>ti</value> <name>ta</name> </parameter> </parameters> </payload>
{ "id": "111", "code": "222", "label": "label payload", "parameter": [ { "name": "ddd", "value": "eee", "id": "111" }, { "name": "rrr", "value": "ttt", "id": "222" } ] }
package mtitek.jackson.marshalling.jaxb; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import mtitek.jackson.marshalling.jaxb.payload.Payload; import mtitek.jackson.marshalling.jaxb.payload.PayloadParameter; public class TestMarshaller { public static void main(String[] args) throws Exception { final Payload payload = initPayload(); JacksonXmlModule xmlModule = new JacksonXmlModule(); xmlModule.setDefaultUseWrapper(false); ObjectMapper objectMapper = new XmlMapper(xmlModule); // Indentation objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // JAXB annotations objectMapper.registerModule(new JaxbAnnotationModule()); System.out.println(objectMapper.writeValueAsString(payload)); } private static Payload initPayload() { final Payload payload = new Payload(); payload.setId("1"); payload.setCode("111"); payload.setDesc("transient"); final List<PayloadParameter> parameters = new ArrayList<>(); { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("1"); parameter.setName("aaa"); parameter.setValue("bbb"); parameters.add(parameter); } { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("2"); parameter.setName("ccc"); parameter.setValue("ddd"); parameters.add(parameter); } payload.setParameters(parameters); return payload; } }
<payload> <id>1</id> <code>111</code> <parameters> <parameter id="1"> <name>aaa</name> <value>bbb</value> </parameter> <parameter id="2"> <name>ccc</name> <value>ddd</value> </parameter> </parameters> </payload>
package mtitek.jackson.marshalling; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import mtitek.jackson.marshalling.payload.Payload; import mtitek.jackson.marshalling.payload.PayloadParameter; public class TestXMLMarshaller { public static void main(String[] args) throws Exception { final Payload payload = initPayload(); JacksonXmlModule xmlModule = new JacksonXmlModule(); xmlModule.setDefaultUseWrapper(false); ObjectMapper objectMapper = new XmlMapper(xmlModule); // Indentation objectMapper.enable(SerializationFeature.INDENT_OUTPUT); System.out.println(objectMapper.writeValueAsString(payload)); } private static Payload initPayload() { final Payload payload = new Payload(); payload.setId("1"); payload.setCode("111"); payload.setLabel("aa vvv ddd"); payload.setDesc("transient"); final List<PayloadParameter> parameters = new ArrayList<>(); { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("1"); parameter.setName("aaa"); parameter.setValue("bbb"); parameters.add(parameter); } { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("2"); parameter.setName("ccc"); parameter.setValue("ddd"); parameters.add(parameter); } payload.setParameters(parameters); return payload; } }
<payload xmlns="http://marshalling.jackson.mtitek/payload"> <id xmlns="">1</id> <code xmlns="">111</code> <label xmlns=""><![CDATA[aa vvv ddd]]></label> <parameters xmlns=""> <parameter id="1"> <name>aaa</name> <value>bbb</value> </parameter> <parameter id="2"> <name>ccc</name> <value>ddd</value> </parameter> </parameters> </payload>
package mtitek.jackson.marshalling; import java.io.IOException; import java.io.InputStream; import javax.xml.bind.JAXBException; import org.xml.sax.SAXException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import mtitek.jackson.marshalling.payload.Payload; import mtitek.jaxb.utils.ResourceUtils; public class TestXMLUnmarshaller { public static void main(String[] args) throws SAXException, IOException, JAXBException { try (final InputStream inputStream = ResourceUtils.getResourceAsStream("payload.xml")) { JacksonXmlModule xmlModule = new JacksonXmlModule(); xmlModule.setDefaultUseWrapper(false); ObjectMapper objectMapper = new XmlMapper(xmlModule); final Payload payload = objectMapper.readValue(inputStream, Payload.class); System.out.println(payload); System.out.println(payload.getParameters()); } } }
Payload [id=123, code=xyz, label=null] [PayloadParameter [id=11, name=bar, value=foo], PayloadParameter [id=22, name=ta, value=ti]]
package mtitek.jackson.marshalling; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import mtitek.jackson.marshalling.payload.Payload; import mtitek.jackson.marshalling.payload.PayloadParameter; public class TestJsonMarshaller { public static void main(String[] args) throws Exception { final Payload payload = initPayload(); ObjectMapper objectMapper = new ObjectMapper(); // Indentation objectMapper.enable(SerializationFeature.INDENT_OUTPUT); System.out.println(objectMapper.writeValueAsString(payload)); } private static Payload initPayload() { final Payload payload = new Payload(); payload.setId("1"); payload.setCode("111"); payload.setLabel("aa vvv ddd"); payload.setDesc("transient"); final List<PayloadParameter> parameters = new ArrayList<>(); { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("1"); parameter.setName("aaa"); parameter.setValue("bbb"); parameters.add(parameter); } { final PayloadParameter parameter = new PayloadParameter(); parameter.setId("2"); parameter.setName("ccc"); parameter.setValue("ddd"); parameters.add(parameter); } payload.setParameters(parameters); return payload; } }
{ "id": "1", "code": "111", "label": "aa vvv ddd", "parameter": [ { "name": "aaa", "value": "bbb", "id": "1" }, { "name": "ccc", "value": "ddd", "id": "2" } ] }
package mtitek.jackson.marshalling; import java.io.IOException; import java.io.InputStream; import javax.xml.bind.JAXBException; import org.xml.sax.SAXException; import com.fasterxml.jackson.databind.ObjectMapper; import mtitek.jackson.marshalling.payload.Payload; import mtitek.jaxb.utils.ResourceUtils; public class TestJsonUnmarshaller { public static void main(String[] args) throws SAXException, IOException, JAXBException { try (final InputStream inputStream = ResourceUtils.getResourceAsStream("payload.json")) { ObjectMapper objectMapper = new ObjectMapper(); final Payload payload = objectMapper.readValue(inputStream, Payload.class); System.out.println(payload); System.out.println(payload.getParameters()); } } }
Payload [id=111, code=222, label=label payload] [PayloadParameter [id=111, name=ddd, value=eee], PayloadParameter [id=222, name=rrr, value=ttt]]