XML和Object之间的转换

Object转换xml

ojbect转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;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值