xml和对象之间的互相转换以及json和对象之间的互相转换

首先先讲json和对象之间的互相转换,因为这个比较简单。

首先引入依赖

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1.2.47</version>

</dependency>

然后可以调用依赖里的方法

JSON.parseObject(str, ApprovalVo.class)是json字符串转化为java实体类; JSON.toJSONString(ApprovalVo)是把实体类转化成json字符串

str就是json字符串,ApprovalVo是实体类,如果这个实体类里面还包含了对象或者数组之类的也不用换方法,外面大的转了的话里面小的可以当作正常实体类取

接下来就是xml和对象之间的互相转换

这是用jaxb来做的xml和对象互转,工具方法就是如下。除了用工具方法,还得在实体类上也做好注解,不然会报错

package com.hnykx.util;

import cn.hutool.core.util.XmlUtil;
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

public class XmlToObject extends XmlUtil {
        /**
         * xml字符串转为bean
         *
         * @param xml   xml字符串
         * @param clazz 需要转成的对象
         * @return
         */
        @SuppressWarnings("unchecked")
        public static <T> T parseBean(String xml, Class<T> clazz) {
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

        /**
         * 将对象转为xml字符串 编码为utf-8 不格式化 省略头部声明
         *
         * @param obj 待转的对象
         * @return
         */
        public static String toStr(Object obj) {
        return toStr(obj, false, true);
    }

        /**
         * 将对象转为xml字符串 编码为utf-8
         *
         * @param obj          待转的对象
         * @param isFormat     是否格式化
         * @param isIgnoreHead 是否忽略头部
         * @return
         */
        public static String toStr(Object obj, boolean isFormat, boolean isIgnoreHead) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, isIgnoreHead);// 是否省略xm头声明信息

            // 不进行转义字符的处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ch, int start, int length, boolean isAttVal, Writer writer)
                        throws IOException {
                    writer.write(ch, start, length);
                }
            });

            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

        /**
         * 将对象转为xml字符串 编码为utf-8 格式化 省略头部声明
         *
         * @param obj 待转的对象
         * @return
         */
        public static String toPrettyStr(Object obj) {
        return toStr(obj, true, true);
    }

        /**
         * 将对象转为xml字符串 编码为 GBK
         *
         * @param obj          待转的对象
         * @param isFormat     是否格式化
         * @param isIgnoreHead 是否忽略头部
         * @return
         */
        public static String toStrGF(Object obj, boolean isFormat, boolean isIgnoreHead) {
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, isIgnoreHead);// 是否省略xm头声明信息

            // 不进行转义字符的处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(), new CharacterEscapeHandler() {
                @Override
                public void escape(char[] ch, int start, int length, boolean isAttVal, Writer writer)
                        throws IOException {
                    writer.write(ch, start, length);
                }
            });

            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }
    }

    }

实体类的注解

@Data
@XmlRootElement(name = "Response")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({AppAndDoadResBody.class})
public class AppAndDoadResBase {
    @XmlElement(name="Head",required = true)
    private ResHeadVO Head;
    @XmlElement(name="Body",required = true)
    private AppAndDoadResBody Body;
}

@XmlRootElement是用来标注外层是标签的,@XmlElement是用来标注外层标签里面的每个内容标签,注意,最好不要用泛型,因为jaxb有个小bug,绑定多个类的话会失效

@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class ResHeadVO {
    private String	TxType;
    private String	TxTime;
    private String	Code;
    private String	Message;
}

如果是属性有复杂的带有list集合包对象的话,可以这样写注解

@Data
@XmlRootElement(name="Body")
@XmlAccessorType(XmlAccessType.FIELD)
public class QueryResBody {
    @XmlElement(name = "CertList",required = true)
    private List<ItemModel> CertList;
}
@Data
@XmlRootElement(name="ItemModel")
@XmlAccessorType(XmlAccessType.FIELD)
public class ItemModel {
    private String	SubscriberName;
}

下面是对象转xml和xml转对象的结果图

 

 觉得还行的话点个赞叭,有问题的也可以评论,看到会回复的哦

顺便再推荐个好用的工具wangzhan,可以用xml和json示例报文直接解析快速生成实体类

json转javaBean实体类在线生成工具—工具猫

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值