【撸码师的备忘录】 Java bean 与 xml 互相转化-JDK Marshaller
2016-04-01 12:14
405 查看
Marshaller Api : http://www.apihome.cn/api/java/Marshaller.html
输出内容:
package lab.s2jh.core.util; import java.io.StringReader; import java.io.StringWriter; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import lab.s2jh.core.annotation.MetaData; import lab.s2jh.core.exception.ServiceException; import lombok.Setter; import lombok.experimental.Accessors; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; /** * Project : Monster-frameWork * Author: XIE-HONGFEI * Company: hongfei tld. * Created Date: 2016/4/1 0001 * Copyright @ 2016 Company hongfei tld. – Confidential and Proprietary * <p/> * History: * ------------------------------------------------------------------------------ * Date | Author | Change Description * 2016/4/1 0001 | 谢xx | 初版做成 * * 描述 : * 1.利用Java内置JAXB对JavaBean进行序列化为xml或将xml反序列化为java bean对象 * 2.涉及实体Bean需有 @XmlRootElement 及 @XmlElement 注解 * note : * @XmlElement注解只能应用在set方法中,如转换对象为ORM-Entity实体对象,则建议不再使用lombok进行代码处理; */ public class JaxbUtils { private static final Logger logger = LoggerFactory.getLogger(JaxbUtils.class); private JAXBContext jaxbContext; /** * 构造所有需要序列化类型的JAXBContent对象 * @param classes */ public JaxbUtils(Class<?>... classes) { try { jaxbContext = JAXBContext.newInstance(classes); } catch (JAXBException e) { e.printStackTrace(); throw new ServiceException("Build JAXBContext Error" + e.getMessage(), e.getCause()); } } public String bean2Xml(Object obj) { try { //输出到控制台 //createMarshaller().marshal(obj,System.out); //输出到字符流 StringWriter writer = new StringWriter(); createMarshaller().marshal(obj, writer); return writer.toString(); } catch (JAXBException e) { e.printStackTrace(); throw new ServiceException("Operate marshal error" + e.getMessage(), e.getCause()); } } public <T> T xml2Bean(String xmlContent) { StringReader reader = new StringReader(xmlContent); try { return (T) createUnmarshaller().unmarshal(reader); } catch (JAXBException e) { throw new ServiceException("Resole xml content to bean Error" + e.getMessage(), e.getCause()); } } /** * Create a <tt>Marshaller</tt> object that can be used to convert a * java content tree into XML data. * * @return a <tt>Marshaller</tt> object * * @throws JAXBException if an error was encountered while creating the * <tt>Marshaller</tt> object */ public Marshaller createMarshaller() { return createMarshaller(null); } /** * Create a <tt>Marshaller</tt> object that can be used to convert a * java content tree into XML data. * * @return a <tt>Marshaller</tt> object * * @throws JAXBException if an error was encountered while creating the * <tt>Marshaller</tt> object */ public Marshaller createMarshaller(String encoding) { try { Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); if (StringUtils.isNotBlank(encoding)) { marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); } return marshaller; } catch (JAXBException e) { throw new ServiceException("Create Marshaller Error , " + e.getMessage(), e.getCause()); } } /** * Create an <tt>Unmarshaller</tt> object that can be used to convert XML * data into a java content tree. * * @return an <tt>Unmarshaller</tt> object * * @throws JAXBException if an error was encountered while creating the * <tt>Unmarshaller</tt> object */ public Unmarshaller createUnmarshaller() { try { return jaxbContext.createUnmarshaller(); } catch (JAXBException e) { throw new ServiceException("Create Unmarshaller Error," + e.getMessage(), e.getCause()); } } /** * @author Administrator * */ @Setter @Accessors(chain = true) @XmlRootElement(name = "example") static class Example { private String examId; //针对实体属性与xml节点名称不一致的情况,可采用name指定的方式进行映射; private String examName; private List<ExampleChild> childs; @Override public String toString() { return "no:" + examId + "\n" + "name:" + examName; } @XmlElement public String getExamId() { return examId; } @XmlElement(name = "example_name") public String getExamName() { return examName; } //节点外层包裹 example_childs层 @XmlElementWrapper(name = "example_childs") @XmlElement(name = "example_child") public List<ExampleChild> getChilds() { return childs; } } /** * * XmlElement作用于getter * @author Administrator * */ @Setter static class ExampleChild { @MetaData(value = "子节点编号") private String childNo; @MetaData(value = "子节点名称") private String childName; @XmlElement public String getChildNo() { return childNo; } @XmlElement public String getChildName() { return childName; } } public static void main(String[] args) { JaxbUtils jaxbUtils = new JaxbUtils(Example.class); Example example = new Example(); example.setExamId("10086"); example.setExamName("中国移动示例"); List<ExampleChild> childs = Lists.newArrayList(); example.setChilds(childs); for (int i = 0; i < 3; i++) { ExampleChild child = new ExampleChild(); child.setChildNo((i + 1) + ""); child.setChildName("子节点名称-" + i); childs.add(child); } System.out.println("========================= bean2Xml 结果开始 ============================="); System.out.println(jaxbUtils.bean2Xml(example)); System.out.println("========================= bean2Xml 结果结束 ============================="); String xmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<example>\n" + " <examId>10010</examId>\n" + " <example_name>中国联通示例</example_name>\n" + "</example>"; Example example2 = jaxbUtils.xml2Bean(xmlContent); System.out.println("========================= xml2Bean 结果开始 ============================="); System.out.println(JsonUtils.writeValueAsString(example2)); System.out.println("========================= xml2Bean 结果开始 ============================="); } }
输出内容:
========================= bean2Xml 结果开始 ============================= <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <example> <example_childs> <example_child> <childName>子节点名称-0</childName> <childNo>1</childNo> </example_child> <example_child> <childName>子节点名称-1</childName> <childNo>2</childNo> </example_child> <example_child> <childName>子节点名称-2</childName> <childNo>3</childNo> </example_child> </example_childs> <examId>10086</examId> <example_name>中国移动示例</example_name> </example> ========================= bean2Xml 结果结束 ============================= ========================= xml2Bean 结果开始 ============================= {"examId":"10010","examName":"中国联通示例","childs":null} ========================= xml2Bean 结果开始 =============================
相关文章推荐
- 前台js对象在后台转化java对象的问题探讨
- 深入JAVA对象深度克隆的详解
- MySQL中日期和时间戳互相转换的函数和方法
- java中url汉字编码互相转换实例
- 我也分享一个字节数组到十六进制字符串互相转换
- Java Day4
- java对象的访问定位方式
- java中对象和json格式相互序列化和反序列化的函数
- Java的引用
- Java对象的驻留
- GB2312, BIG5, UTF8, Unicode之间的互换
- 简体中文与繁体中文互转
- Java对象与JSON字符串互转
- 声明对象和实例化对象的区别
- Java服务器端List对象转换为JSON对象并返回客户端实例
- JAVA对象内存布局
- MFC的CWnd和HWND之间互相转换方法
- 关于json的解析
- JAVA 对象引用以及对象赋值
- Android中关于JNI 的学习(三)在JNI层访问Java端对象