Object转换xml
xml转Object
正常情况下转换是没问题的,但是如果字段添加了@JacksonXmlProperty(localName = "pyld:requestID")
指定的名称带有冒号,则转换会失败,GitHub有解决方法
import com.ctc.wstx.stax.WstxInputFactory;
import com.ctc.wstx.stax.WstxOutputFactory;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
import com.zhuzi.bean.OadrPayload;
import org.junit.jupiter.api.Test;
import javax.xml.stream.XMLInputFactory;
import java.io.IOException;
public class XmlDemo {
public static XmlMapper xmlMapper;
static {
//localName = "oadr:oadrSignedObject" 包含冒号,反序列化有问题需要这个|https://github.com/FasterXML/jackson-dataformat-xml/issues/63|
XMLInputFactory input = new WstxInputFactory();
input.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
XmlMapper.Builder builder = XmlMapper.builder(new XmlFactory(input, new WstxOutputFactory())).enable(MapperFeature.USE_STD_BEAN_NAMING).defaultUseWrapper(false);
//xmlMapper = builder.build();
//①
xmlMapper = new XmlMapper(new XmlFactory(input, new WstxOutputFactory()));
xmlMapper = new XmlMapper(new XmlFactory(input));
//②
//xmlMapper = new XmlMapper(input);
//反序列化时,若实体类没有对应的属性,是否抛出JsonMappingException异常,false忽略掉
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//序列化是否绕根元素,true,则以类名为根元素
xmlMapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false);
xmlMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//XML标签名:使用骆驼命名的属性名,
//xmlMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
xmlMapper.enable(MapperFeature.USE_STD_BEAN_NAMING);
//xml 头|<?xml version='1.0' encoding='UTF-8'?>
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
xmlMapper.setDefaultUseWrapper(false);
//美化输出|也可使用 mapper.writerWithDefaultPrettyPrinter().writeValueAsString(person)
xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
//设置Null值,如果不设置 会生成闭合标签,例如 <eivenID/>
xmlMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
@Override
public void serialize(Object param, JsonGenerator jsonGenerator, SerializerProvider paramSerializerProvider) throws IOException {
jsonGenerator.writeString("");
}
});
//xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
}
@Test
public void convertXml() throws IOException {
OadrPayload.OadrCreatePartyRegistration oadrCreatePartyRegistration = new OadrPayload.OadrCreatePartyRegistration();
oadrCreatePartyRegistration.setSchemaVersion("2.0b");
oadrCreatePartyRegistration.setRequestID("REQ_123");
oadrCreatePartyRegistration.setVenID("");
oadrCreatePartyRegistration.setOadrProfileName("2.0b");
oadrCreatePartyRegistration.setOadrTransportName("simpleHttp");
oadrCreatePartyRegistration.setOadrTransportAddress("http://www.myaddress.com");
oadrCreatePartyRegistration.setOadrReportOnly("false");
oadrCreatePartyRegistration.setOadrXmlSignature("false");
oadrCreatePartyRegistration.setOadrVenName("MyVEN");
oadrCreatePartyRegistration.setOadrHttpPullModel("true");
OadrPayload.OadrSignedObject oadrSignedObject = new OadrPayload.OadrSignedObject();
oadrSignedObject.setName("哈哈");
oadrSignedObject.setOadrCreatePartyRegistration(oadrCreatePartyRegistration);
OadrPayload oadrPayload = new OadrPayload().setOadrSignedObject(oadrSignedObject);
String s = xmlMapper.writeValueAsString(oadrPayload);
System.out.println(s);
OadrPayload oadrPayload2 = xmlMapper.readValue(s, OadrPayload.class);
System.out.println(oadrPayload2.getOadrSignedObject());
}
}
实体
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@JacksonXmlRootElement(localName = "oadr:oadrPayload")
public class OadrPayload {
@JacksonXmlProperty(localName = "xmlns:emix", isAttribute = true)
String emix = "http://docs.oasis-open.org/ns/emix/2011/06";
/* @JacksonXmlProperty(localName = "xmlns:power", isAttribute = true)
String power = "http://docs.oasis-open.org/ns/emix/2011/06/power";
@JacksonXmlProperty(localName = "xmlns:scale", isAttribute = true)
String scale = "http://docs.oasis-open.org/ns/emix/2011/06/siscale";
@JacksonXmlProperty(localName = "xmlns:ei", isAttribute = true)
String ei = "http://docs.oasis-open.org/ns/energyinterop/201110";
@JacksonXmlProperty(localName = "xmlns:pyld", isAttribute = true)
String pyld = "http://docs.oasis-open.org/ns/energyinterop/201110/payloads";
@JacksonXmlProperty(localName = "xmlns:oadr", isAttribute = true)
String oadr = "http://openadr.org/oadr-2.0b/2012/07";
@JacksonXmlProperty(localName = "xmlns:n2", isAttribute = true)
String n2 = "http://www.altova.com/samplexml/other-namespace";
@JacksonXmlProperty(localName = "xmlns:gml", isAttribute = true)
String gml = "http://www.opengis.net/gml/3.2";
@JacksonXmlProperty(localName = "xmlns:ds", isAttribute = true)
String ds = "http://www.w3.org/2000/09/xmldsig#";
@JacksonXmlProperty(localName = "xmlns:xsi", isAttribute = true)
String xsi = "http://www.w3.org/2001/XMLSchema-instance";
@JacksonXmlProperty(localName = "xmlns:atom", isAttribute = true)
String atom = "http://www.w3.org/2005/Atom";
@JacksonXmlProperty(localName = "xmlns:xcal", isAttribute = true)
String xcal = "urn:ietf:params:xml:ns:icalendar-2.0";
@JacksonXmlProperty(localName = "xmlns:strm", isAttribute = true)
String strm = "urn:ietf:params:xml:ns:icalendar-2.0:stream";*/
@JacksonXmlProperty(localName = "oadr:oadrSignedObject")
private OadrSignedObject oadrSignedObject;
@Data
@JacksonXmlRootElement(localName = "oadr:oadrSignedObject")
public static class OadrSignedObject {
@JsonProperty("AREA_ID")
private String name;
@JacksonXmlProperty(localName = "oadr:oadrCreatePartyRegistration")
private OadrCreatePartyRegistration oadrCreatePartyRegistration;
}
@Data
@JacksonXmlRootElement(localName = "oadr:oadrCreatePartyRegistration")
public static class OadrCreatePartyRegistration {
@JacksonXmlProperty(localName = "ei:schemaVersion", isAttribute = true)
private String schemaVersion;
@JacksonXmlProperty(localName = "pyld:requestID")
private String requestID;
@JacksonXmlProperty(localName = "ei:venID")
private String venID;
@JacksonXmlProperty(localName = "oadr:oadrProfileName")
private String oadrProfileName;
@JacksonXmlProperty(localName = "oadr:oadrTransportName")
private String oadrTransportName;
@JacksonXmlProperty(localName = "oadr:oadrTransportAddress")
private String oadrTransportAddress;
@JacksonXmlProperty(localName = "oadr:oadrReportOnly")
private String oadrReportOnly;
@JacksonXmlProperty(localName = "oadr:oadrXmlSignature")
private String oadrXmlSignature;
@JacksonXmlProperty(localName = "oadr:oadrVenName")
private String oadrVenName;
@JacksonXmlProperty(localName = "oadr:oadrHttpPullModel")
private String oadrHttpPullModel;
}
}