XML JSON JavaBean相互转换

程序员小白初入CSDN多多关照

  • 目的
  • 做的一些工作
  • 环境
  • XML与JSON
    • XML2JSON
    • JSON2XML
  • XML与JavaBean
    • JavaBean
    • XML2JavaBean
    • JavaBean2XML
      • 通过JAXB实现转换
      • 使用XStream转单个Bean
      • 使用XStream转List Bean
  • JavaBean与JSON
    • JavaBean2JSON
    • JSON2JavaBean
  • 结语

目的

其实吧就是刚开始实习,老师傅让我接触的第一个东西嘿嘿,觉得不写个目的好像不太专业哦,然后写到博客也是为了增加自己的社交面,争取结交大佬,然后目前工作较为轻松,写写博客也算是丰富业余生活。

做的一些工作

结合各大代码平台进行整合,找出了几个自己适用的方法实现转换,在这个复杂的社会学会“变通“”还是很有用的:

  1. 相关环境
  2. 实现XML2JSON
  3. 实现JSON2XML
  4. 实现XML2JavaBean
  5. 实现JavaBean2XML
  6. 实现JavaBean2JSON
  7. 实现JSON2JavaBean

环境

我使用的是Eclipse,jer是1.8的,嗯嗯…好像没说什么

XML与JSON

(1).XML的优缺点
<1>.XML的优点
  A.格式统一,符合标准;
  B.容易与其他系统进行远程交互,数据共享比较方便。
<2>.XML的缺点
  A.XML文件庞大,文件格式复杂,传输占带宽;
  B.服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
  C.客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
  D.服务器端和客户端解析XML花费较多的资源和时间。

(2).JSON的优缺点
<1>.JSON的优点:
  A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
  B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
  C.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
  D.在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
  E.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
<2>.JSON的缺点
  A.没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;
  B.JSON格式目前在Web Service中推广还属于初级阶段。
  采用

XML2JSON

import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import de.odysseus.staxon.json.JsonXMLConfig;
import de.odysseus.staxon.json.JsonXMLConfigBuilder;
import de.odysseus.staxon.json.JsonXMLInputFactory;
import de.odysseus.staxon.xml.util.PrettyXMLEventWriter;

这是用的一些包,主要还是hutool工具箱
然后具体实现

	/**
	 * xml String to JSONObject
	 */
	public static JSONObject xml2Json() {
		String xml = "123aaaaaa21"
				+ "124bbbbbb22";
		//使用hutool工具箱功能实现
		JSONObject xmlJSONObj = XML.toJSONObject(xml);
//		System.out.println(xmlJSONObj);
		return xmlJSONObj;
	}	

好吧,好丑,为什么没有别人的代码段华丽…
然后测试一下

	public static void main(String[] args) {
		JSONObject json = xml2Json();
		System.out.println("得到的json串:\n" + json);
	}

结果:
xml串没有显示完全,但是可以看到结果的..

JSON2XML

直接上代码,我当时两个方法写在一起了

	/**
	 * json String to xml String
	 */
	public static String json2xml(String json) {

//		String作为数据源
//		StringReader 是读, 从一个String中读取,所以需要一个String ,通过构造方法传递
//		StringWriter 是写, 写入到一个String中去,所以它内部提供了一个StringBuffer(便于修改字符串)中用来保存数据
		StringReader input = new StringReader(json);
		StringWriter output = new StringWriter();
		JsonXMLConfig config = new JsonXMLConfigBuilder().multiplePI(false).repairingNamespaces(false).build();
		try {
			XMLEventReader reader = new JsonXMLInputFactory(config).createXMLEventReader(input);
			XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output);
			writer = new PrettyXMLEventWriter(writer);
			writer.add(reader);
			reader.close();
			writer.close();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				output.close();
				input.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
//		if (output.toString().length() >= 38) {// remove 
//			System.out.println(output.toString().substring(39));
//			return output.toString().substring(39);
//		}
		return output.toString();
		}

最后一部分注释掉了,这个根据大家的需求看吧
测试一下,这个是写了一个串,包含了许多数组啊什么的自认为复杂的串…

	public static void main(String[] args) {
		String jsonStr1 = 
				"{\"student1\":\r\n" + 
				"	{\"name\":\"aaa\",\"age\":20,\"home\":\"nxyc\",\r\n" + 
				"		\"subject\":[\r\n" + 
				"			{\"subjectName\":\"sjjg\",\"teacher\":\"wxp\",\"time\":16,\r\n" + 
				"				\"location\":[\"yijiao\",\"bizong\",\"Llou\"]},\r\n" + 
				"			{\"subjectName\":\"mxdx\",\"teacher\":\"mzr\",\"time\":16},\r\n" + 
				"			{\"subjectName\":\"jsjwl\",\"teacher\":\"wh\",\"time\":16}\r\n" + 
				"		],\r\n" + 
				"		\"hobby\":[\r\n" + 
				"			{\"hname\":\"basketball\"},\r\n" + 
				"			{\"hname\":\"football\"}\r\n" + 
				"		],\r\n" + 
				"		\"sites\":[\"baidu\",\"taobao\",\"google\"]\r\n" + 
				"	},\r\n" + 
				" \"student2\":\r\n" + 
				"	{\"name\":\"bbb\",\"age\":22,\"home\":\"nxwz\",\r\n" + 
				"		\"subject\":{\"subject1\":\"rjgc\",\"subject2\":\"rjtxjgs\"}}\r\n" + 
				"}";
		String xml = json2xml(jsonStr1);
		System.out.print("得到的xml串:\n" + xml);
	}

结果:
XML JSON JavaBean相互转换_第1张图片

XML与JavaBean

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。
简介原文链接:https://blog.csdn.net/wn084/article/details/80853587

JavaBean

@XmlRootElement
public class Student {
	@XmlElement
	private String id;
	
	@XmlElement
	private String name;
	
	@XmlElement
	private String age;
	
	@XmlTransient  
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	@XmlTransient  
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@XmlTransient  
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String toString() {
		return "Student [id=" + id + ",name=" + name + ",age=" + age + "]";
	}
}

XML2JavaBean

适用JAXB中的方法实现

	public static void xml2Bean() {

//		String xml = "123aaaaaa21";
		String xml = "123aaaaaa21";
//		System.out.println("初始输入xml String\n" + xml);
		try {
//			File file = new File("E:\\student.xml"); 
			StringReader read = new StringReader(xml);  //读取字符串
//			JAXB(即Java Architecturefor XML Binding)是一个业界的标准,
//			即是一项可以根据XML Schema产生Java类的技术。
//			该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,
//			并能将Java对象树的内容重新写到XML实例文档。
	        JAXBContext jaxbC = JAXBContext.newInstance(Student.class);  //创建jaxbc结构为Student.class
	        Unmarshaller us = jaxbC.createUnmarshaller();  
//			unmarshal()是把xml对象转化为我们需要的java对象的方法 
	        Student stu1=(Student)us.unmarshal(read);  //格式要求???
	        System.out.println("得到的JavaBean:\n" + stu1.toString()); 			
	        } catch (JAXBException e) {  
	        	e.printStackTrace();  
	        } 
//		Student stu = convertToJavaBean(xml,Student.class);
	}

这个测试直接调用就好
结果:
在这里插入图片描述

JavaBean2XML

这里有三个。①通过JAXB实现转换。②使用XStream转单个Bean。③使用XStream转ListBean

通过JAXB实现转换

有些懒,和XML2JavaBean的没有分开

		try {
//			File file = new File("E:\\student.xml"); 
			StringReader read = new StringReader(xml);  //读取字符串
//			JAXB(即Java Architecturefor XML Binding)是一个业界的标准,
//			即是一项可以根据XML Schema产生Java类的技术。
//			该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,
//			并能将Java对象树的内容重新写到XML实例文档。
	        JAXBContext jaxbC = JAXBContext.newInstance(Student.class);  //创建jaxbc结构为Student.class
	        Unmarshaller us = jaxbC.createUnmarshaller();  
//			unmarshal()是把xml对象转化为我们需要的java对象的方法 
	        Student stu1=(Student)us.unmarshal(read);  //格式要求???
	        System.out.println("得到的JavaBean:\n" + stu1.toString()); 
			
			JAXBContext context = JAXBContext.newInstance(stu1.getClass());//使用对象生成xml
			Marshaller marshaller = context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
			StringWriter output = new StringWriter();
			marshaller.marshal(stu1, output);
			System.out.println("方法一得到的xml:\n" + output);
			
	        } catch (JAXBException e) {  
	        	e.printStackTrace();  
	        } 

结果
XML JSON JavaBean相互转换_第2张图片

使用XStream转单个Bean

	/**
	 * javaBean to xml method two
	 */
	public static void Bean2xml() {
		Student stu = new Student();
		stu.setId("123");
		stu.setName("bbbbbb");
		stu.setAge("22");
		XStream xStream = new XStream();
		xStream.alias("student", Student.class);
//		xStream.aliasPackage("com.change.entry.Student", "student");
//		xStream.alias("id", Student.class);
//		xStream.alias("name", Student.class);
//		xStream.alias("age", Student.class);

		String s = xStream.toXML(stu);
		System.out.println("方法2得到的xml:\n" + s);
	}

结果:
XML JSON JavaBean相互转换_第3张图片

使用XStream转List Bean

	/**
	 * javaBean to xml
	 * javaBean List
	 */
	public static void Bean2xml2() {
		Student stu1 = new Student();
		Student stu2 = new Student();
		Student stu3 = new Student();
		Student stu4 = new Student();
		stu1.setId("111");
		stu2.setId("222");
		stu3.setId("333");
		stu4.setId("444");
		stu1.setName("aaaaaa");
		stu2.setName("bbbbbb");
		stu3.setName("cccccc");
		stu4.setName("cccccc");
		stu1.setAge("21");
		stu2.setAge("22");
		stu3.setAge("23");
		stu4.setAge("24");
		
		ArrayList list = new ArrayList();
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);
		list.add(stu4);
		
//		System.out.println("123"+list.get(3));
		XStream xStream = new XStream();
		xStream.alias("student", Student.class);
//		xStream.aliasPackage("com.change.entry.Student", "student");
//		xStream.alias("id", Student.class);
//		xStream.alias("name", Student.class);
//		xStream.alias("age", Student.class);

		String s = xStream.toXML(list);
		System.out.println("方法2得到的xml:\n" + s);
		
	}

结果:
XML JSON JavaBean相互转换_第4张图片

JavaBean与JSON

JavaBean2JSON

	/** 
     * javaBean to json String
     * 一个Student的实体类,
	 * 使用了JSONObject和JSONArray两种方式转化为JSON字符串
     */
	public static void javaBean2json() {
	Student stu = new Student();
	stu.setId("123");
	stu.setName("JSON");
	stu.setAge("22");
	JSONObject json = JSONObject.fromObject(stu);
	JSONArray array = JSONArray.fromObject(stu);
	String jsonStr = json.toString();
	String arrayStr = array.toString();
	System.out.println("得到的jsonStr:" + jsonStr);
	System.out.println("得到的arrayStr:" + arrayStr);
	}

结果:
在这里插入图片描述

JSON2JavaBean

	/** 
     * json to javaBean
     */
	public static void json2javaBean() {
//		{"name":"JSON","id":"123","age":"22"}
		String ObjectStr = "{\"name\":\"JSON\",\"id\":\"123\",\"age\":\"22\"}";
		String arrayStr = "[{\"id\":\"123\",\"name\":\"JSON\",\"age\":\"22\"}]";
		//转为json串
		JSONObject json1 = JSONObject.fromObject(ObjectStr);
		Student stu1 = (Student)JSONObject.toBean(json1, Student.class);
		System.out.println("得到的stu1:" + stu1);
		
		//转为json数组		
		JSONArray jsonArray = JSONArray.fromObject(arrayStr);
		Object o = jsonArray.get(0);
		JSONObject json2 = JSONObject.fromObject(o);
		Student stu2 = (Student)JSONObject.toBean(json2,Student.class);
		System.out.println("得到的stu2:" + stu2);
	}

在这里插入图片描述

结语

第一次写有些对不起读者啊,后面基本就是码代码了,没有什么实质性的内容,不过还是希望给新人一些支持,我要做祖国的花朵,需要你们的灌溉哈哈。

<很抱歉,当时写代码的时候没有考虑会写博客这个东西,然后参考了很多人的,也没有留下链接,希望原创有发现的可以告我一声,这个玩意后期应该可以修改的吧,或者我重发也可以>

你可能感兴趣的:(XML JSON JavaBean相互转换)